因为数组中的类型不具体object
- 它们是 3 种不同的类型,都是对象的子类。
如果您使用可以在数组中推断的特定类型,编译器将推断该类型。例如,这很好:
var arr = new[] {3, 4, 5}; // Will correctly infer int[]
请注意,C# 语言规范的 8.5.1 中明确指出了这一点,其中指出var
受以下限制:
- 局部变量声明不能包含多个局部变量声明符。
- 局部变量声明符必须包含局部变量初始化程序。
- 局部变量初始化程序必须是表达式。
- 初始化表达式必须具有编译时类型。
- 初始化表达式不能引用声明的变量本身
对于数组,有一个指定的示例:
var y = {1, 2, 3}; // Error, array initializer not permitted
至于new [] {"bla bla bla..", 23, true };
例如,这在 7.6.10 中有所提及。在那里,这个例子:
var d = new[] { 1, "one", 2, "two" }; // Error
据说这是一个错误,因为:
最后一个表达式会导致编译时错误,因为 int 和 string 都不能隐式地相互转换,因此不存在最佳通用类型。在这种情况下,必须使用显式类型化的数组创建表达式,例如将类型指定为 object[]。或者,可以将其中一个元素转换为公共基类型,然后该基类型将成为推断的元素类型