【发布时间】:2018-12-04 14:32:25
【问题描述】:
当 x 是来自用户定义类的对象时,在 Console.WriteLine(x) 中完成的隐式转换的顺序是什么:
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(Visual Studio 2017 社区版的全新安装)
-
我将假设它返回
42,因为v11.x是int,而不是double或string,并且当v11用于@987654331 时@,它调用Vector的ToString()方法,它调用v11.x.ToString()。如果我错了,请纠正我。 -
C# 重载解析是规范中最有趣的部分!我所说的“有趣”是指“当你开始做它并希望做你想做的事情时非常复杂,这样你就不必深入研究细节”。对于very specific interpretation of "better",采用
int的Console.WriteLine重载被认为“更好”。我还没有通过它来获得确切的细节。如果 Eric Lippert 有时间,他会出现并解释。 :-) -
这激起了我的好奇心,所以我去找Does implicit operator have higher priority over ToString() method? - 答案是肯定的。
-
事实上,链接的问题不是重复的,因为这里没有明确调用
ToString。为什么选择Console.WriteLine(int)作为调用方法,而不是(比如)Console.WriteLine(double),这个问题没有得到另一个问题的回答,也没有为什么添加另一个转换会产生歧义。许多有趣的是重载解析和转换引起的问题,但它们并不完全相同。