C#中的类型推断不起作用?

Neo*_*isk 5 c# vb.net type-inference

给出以下C#代码:

var a = new[] {"123", "321", 1}; //no best type found for implicitly typed array
Run Code Online (Sandbox Code Playgroud)

与VB.NET中的对应物:

Dim a = {"123", "321", 1} 'no errors
Run Code Online (Sandbox Code Playgroud)

似乎VB.NET能够正确地推断出a=的类型Object(),而C#会抱怨,直到上面的内容被修复为:

var a = new object[] {"123", "321", 1};
Run Code Online (Sandbox Code Playgroud)

有没有办法在上述场景中自动推断C#中的类型?

编辑:在C#沙箱中使用不同类型后的有趣观察 - 如果所有元素在继承树中具有共同父项,并且该父项不是 a Object,或者如果元素可以转换为更宽泛的类型,则可以正确推断类型(不丢失精度,例如Integer -> Double).所以这两个都可行:

var a = new[] {1, 1.0}; //will infer double[]
var a = new[] {new A(), new B()}; //will infer A[], if B inherits from A
Run Code Online (Sandbox Code Playgroud)

我认为这种行为在C#中是不一致的,因为所有类型都继承自Object,所以它与其他任何类型的祖先都没有太大不同.这可能是一个设计,所以没有必要争论,但如果你知道原因,知道原因会很有趣.

Jon*_*eet 9

否.C#中的隐式类型数组要求数组初始值设定项中某个表达式的类型是目标类型.基本上,编译器试图找到恰好一个元素类型,以便可以将所有其他类型转换为它.

您当然可以投射任何元素object:

var a = new[] { (object) "123", "321", 1}; 
Run Code Online (Sandbox Code Playgroud)

...但是你可能只使用一个显式类型的数组初始值设定项:

var a = new object[] {"123", "321", 1}; 
Run Code Online (Sandbox Code Playgroud)

或者在您确实同时声明变量的情况下:

object[] a = {"123", "321", 1};
Run Code Online (Sandbox Code Playgroud)