gpt4 book ai didi

c# - C#中隐式转换的顺序

转载 作者:太空狗 更新时间:2023-10-29 17:56:47 25 4
gpt4 key购买 nike

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

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

最佳答案

因此打印的内容完全基于选择了 Console.WriteLine 的重载。选择哪个重载是基于函数成员的“更好”规范的第 7.5.3.2 节。

当一个重载的参数比另一个重载“更具体”时,它就比另一个重载“更好”。 “更具体”意味着存在从更具体的类型到更不具体的类型的隐式转换,并且没有从不太具体的类型到更具体的类型的隐式转换。

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

因此,如果存在从您的对象到 string 的隐式转换,则会考虑字符串重载,并且“最佳”重载并列,并且您会收到错误。当它丢失时,所有考虑的重载都有一个“最具体”的类型(int),所以它是“最好的”,并且选择了该重载。

关于c# - C#中隐式转换的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53615219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com