有人可以解释编译器如何在这里找到“通用”类型(双精度)。
我认为 IConvertible 在这里发挥作用?
private static void Main(string[] args)
{
var nrColl = new[] { 1, 2, 0.14, 'a',};
}
发生这种情况是因为您在此处给出的每种类型都可以隐式转换为双精度型。 当您尝试将字符 (
'a'
) 更改为字符串 ("a"
) 时,您会发现它不再起作用。这是因为 .Net 中的字符只不过是带有一些附加方法和不同覆盖(例如 ToString
)的 UInt16,并且它定义了到 double 的隐式转换。
这是一个例子:
public static void Main()
{
var bar = new[] { 1, 2, 0.14, 'a', new Foo(42)};
}
public class Foo
{
public Foo(int value)
{
_value = value;
}
private int _value;
public static implicit operator double(Foo foo)
{
return foo._value;
}
}
有趣的是,如果不存在直接隐式运算符,但存在多个隐式运算符链,则这也适用。
public static void Main()
{
var bar = new[] { 1, 2, 0.14, 'a', new Foo(42)};
}
public class Foo
{
public Foo(int value)
{
_value = value;
}
private int _value;
public static implicit operator int(Foo foo)
{
return foo._value;
}
}
但是由于某种原因,这种“转换链”似乎只适用于内部类型。
这不起作用:
public static void Main()
{
var bar = new[] { 1, 2, 0.14, 'a', new Foo(42)};
}
public class Bar
{
public Bar(int value)
{
Value = value;
}
public int Value { get; set; }
public static implicit operator double(Bar bar) => bar.Value;
}
public class Foo
{
public Foo(int value)
{
_value = value;
}
private int _value;
public static implicit operator Bar(Foo foo)
{
return new Bar(foo._value);
}
}