C#中隐式转换的顺序

Order of implicit conversions in c#

当 x 是用户定义的对象时,Console.WriteLine(x) 中隐式转换的顺序是什么 class:

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

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

所以打印的内容完全取决于选择了 Console.WriteLine 的重载。选择哪个重载是基于 "betterness" 函数成员规范的第 7.5.3.2 节。

当一个重载的参数比另一个重载 "more specific" 时,它比另一个重载 "better"。 "more specific" 表示存在从较具体类型到较不具体类型的隐式转换, 从较不具体类型到较具体类型的隐式转换。

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

因此,如果存在从您的对象到 string 的隐式转换,则会考虑字符串重载,并且存在 "best" 重载的关系,您会收到错误。当它丢失时,所有考虑的重载都有一个 "most specific" 类型(即 int),所以它是 "the best",并且选择了该重载。