为什么编译器无法推断对象数组类型?

2024-04-21

我想知道为什么这是有效的:

object[] array = {"bla bla bla..", 23, true};

但这些不是:

var array = {"bla bla bla..", 23, true };
var array2 = new [] {"bla bla bla..", 23, true };

在第二个示例中,为什么编译器无法根据数组初始值设定项中的值推断数组类型?这似乎很容易做到,特别是与泛型类型推断相比。为了定义对象数组,为什么我必须显式指定数组类型?

var array = new object[] { "bla bla bla..", 23, true };

因为数组中的类型不具体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[]。或者,可以将其中一个元素转换为公共基类型,然后该基类型将成为推断的元素类型

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么编译器无法推断对象数组类型? 的相关文章

随机推荐