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",并且选择了该重载。
当 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",并且选择了该重载。