考虑以下代码片段以按时间顺序跟随我的想法。注释语句无法编译。
var data1 = new int[3] { 1, 2, 3 };
var data2 = new int[] { 1, 2, 3 };
var data3 = new[] { 1, 2, 3 };
var data4 = new[] { 1, 2, 3.0f };
data3
和 data4
的简化是可以理解的。
int[] data5 = { 1, 2, 3 };
//var data6 = { 1, 2, 3 };
无法推断 data6
的声明是可以理解的。
var data7 = new int[] { };
//var data8 = new [] { };
//int[] data9 = new [] { };
无法推断data8
的声明也是可以理解的。
我不明白的是为什么不能编译信息量较大的data9
,而可以编译信息量较少的data10
。
int[] data10 = { };
//var data11 = { };
声明不能编译的data11
也是可以理解的。
最佳答案
存在 new
的情况存在关键字,是可以在需要表达式的任何上下文中单独使用的常用表达式。您将它们用于带赋值的声明,但它们可以用于其他上下文,例如:
return new[] { 3 };
或:
Call(new[] { 3 });
等等。在这些new
数组表达式,类型必须从表达式本身清楚。即使左侧有变量声明,这也是必需的。
案例data9
因此,与 int[] data9 = new [] { };
是非法的,因为表达式 new[] { }
是非法的。它有点像:
object related9 = someBoolean ? "Yes" : new Exception();
这也是非法的,因为表达式 someBoolean ? "Yes" : new Exception()
本身是非法的,具有不兼容的类型。有一个 object
类型的声明, 但这并不能使右侧合法。
例子data5
和 data10
显示一个完全不相关的数组变量声明语法。
int[] data5 = { 1, 2, 3 };
这里是 =
的右侧运算符本身不是表达式。此语法需要在 =
左侧使用显式类型声明标志(所以 data6
不可行)。此语法与对象初始化器 和集合初始化器 相关,并与它们一起引入到 C# 语言中,而 new[] { ... }
语法有点旧。
你应该看到 this answer by Lippert ,然后阅读官方 C# 语言规范。
关于c# - 惊讶地发现 C# 编译器可以推断出信息较少的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127792/