C#中的隐式转换顺序

时间:2018-12-04 14:32:26

标签: c# implicit-conversion implicit-cast

当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";
        }

我知道我应该避免使用隐式强制转换,而只是出于好奇!

1 个答案:

答案 0 :(得分:3)

因此打印的内容完全基于选择的Console.WriteLine的重载。选择哪种重载基于功能成员“更好”规范的第7.5.3.2节。

当重载的参数比另一个重载时,重载比另一个重载更好。 “更具体”是指从更具体的类型到不太具体的类型进行隐式转换,而没有从不那么具体的类型到更具体的类型进行隐式转换。

object是最不明确的重载,因为没有从它到int,double或string的隐式转换,但每种类型都有一个隐式转换。 int比double更具体,因为存在从int到double的隐式转换,但没有从double到int的转换。 int和string之间没有隐式转换,因此两者都不是更具体的,因此彼此之间也不会有更好或更差的结果。

因此,如果存在从您的对象到string的隐式转换,那么将考虑字符串重载,并且“最佳”重载也有关系,您会得到一个错误。如果缺少它,则在所有考虑的重载中都存在“最特定的”类型(即int),因此它是“最佳”,并选择了重载。