当x是用户定义的类的对象时,在Console.WriteLine(x)中进行的隐式转换顺序是什么?
为什么我得到的是42,而不是3.14或“12”?为什么我不能添加一个额外的隐式转换到字符串/在CW(int)和CW(string)之间存在歧义,导致编译器错误/:
class Vector
{
public int x = 12;
public static implicit operator double(Vector v1)
{
return 3.14;
}
public static implicit operator int(Vector v1)
{
return 42;
}
public override string ToString()
{
return this.x.ToString();
}
}
static void Main(string[] args)
{
Vector v11 = new Vector();
Console.WriteLine(v11);
}
为什么我得到的是42,而不是3.14或“12”?为什么我不能添加一个额外的隐式转换到字符串/在CW(int)和CW(string)之间存在歧义,导致编译器错误/:
public static implicit operator string(Vector v1)
{
return "42";
}
我知道应该避免使用隐式转换,但只是出于好奇!
42
是因为v11.x
是一个int
,而不是double
或string
,当在Console.WriteLine()
中使用v11
时,它调用了Vector
的ToString()
方法,该方法又调用了v11.x.ToString()
。如果我错了,请纠正我。 - absoluteAquarianint
参数的Console.WriteLine
重载被认为是“更好”的选择,对于一个非常具体的“更好”解释。我还没有研究过确切的细节。如果Eric Lippert有时间,他会出现并解释的 :-) - Jeroen Mostert.ToString
的存在或缺失是一个转移注意力的问题,因为它从未参与其中:这需要选择Console.WriteLine(object)
重载以便可以在后台调用.ToString()
。只有通过显式强制转换才能实现这一点,因为如果有选择的话,object
永远不是更好的目标。 - Jeroen Mostert