[英]Order of implicit conversions in c#
当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(字符串)/之间存在歧义的编译器错误:
public static implicit operator string(Vector v1)
{
return "42";
}
我知道我应该避免使用隐式演员,但仅仅是为了好奇!
所以打印的内容完全取决于选择Console.WriteLine
重载。 选择哪个重载基于函数成员“更好”规范的7.5.3.2节。
当一个参数具有比另一个更“特定”的参数时,它比另一个“更好”。 “更具体”意味着从更具体的类型到更不具体的类型的隐式转换,并且没有从较不具体的类型到更具体的类型的隐式转换。
object
是最不具体的重载,因为没有从它到int,double或string的隐式转换,但每种类型都有一个。 int比double更具体,因为从int到double的隐式转换,但没有从double到int的转换。 int和string之间没有隐式转换,所以两者都没有更具体,所以它们都不比另一个更好或更差。
因此,如果存在从对象到string
的隐式转换,则会考虑字符串重载,并且“最佳”重载存在并列,并且您会收到错误。 当它缺失时,所有被考虑的重载(都是int
)都是“最具体”类型,因此它是“最好的”,并且选择了重载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.