当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";
}
我知道我应该避免使用隐式强制转换,而只是出于好奇!
答案 0 :(得分:3)
因此打印的内容完全基于选择的Console.WriteLine
的重载。选择哪种重载基于功能成员“更好”规范的第7.5.3.2节。
当重载的参数比另一个重载时,重载比另一个重载更好。 “更具体”是指从更具体的类型到不太具体的类型进行隐式转换,而没有从不那么具体的类型到更具体的类型进行隐式转换。
object
是最不明确的重载,因为没有从它到int,double或string的隐式转换,但每种类型都有一个隐式转换。 int比double更具体,因为存在从int到double的隐式转换,但没有从double到int的转换。 int和string之间没有隐式转换,因此两者都不是更具体的,因此彼此之间也不会有更好或更差的结果。
因此,如果存在从您的对象到string
的隐式转换,那么将考虑字符串重载,并且“最佳”重载也有关系,您会得到一个错误。如果缺少它,则在所有考虑的重载中都存在“最特定的”类型(即int
),因此它是“最佳”,并选择了重载。