c# - 惊讶地发现 C# 编译器可以推断出信息较少的声明

标签 c# arrays

考虑以下代码片段以按时间顺序跟随我的想法。注释语句无法编译。

    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 };

data3data4 的简化是可以理解的。

    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 类型的声明, 但这并不能使右侧合法。


例子data5data10显示一个完全不相关的数组变量声明语法。

int[] data5 = { 1, 2, 3 };

这里是 = 的右侧运算符本身不是表达式。此语法需要在 = 左侧使用显式类型声明标志(所以 data6 不可行)。此语法与对象初始化器集合初始化器 相关,并与它们一起引入到 C# 语言中,而 new[] { ... }语法有点旧。


你应该看到 this answer by Lippert ,然后阅读官方 C# 语言规范。

关于c# - 惊讶地发现 C# 编译器可以推断出信息较少的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127792/

相关文章:

javascript - 将 javascript 对象拆分为键值数组

ios - 我无法在任何地方访问数组对象,如何快速访问它们?

arrays - golang : convert uint32 (or any built-in type) to []byte (to be written in a file)

c# - C# 检查Excel文件是否为空

c# - DNN 7.3.4 中的/signalr/hubs 404(未找到)

c# - AutoMapper.AutoMapperMappingException : Type 'System.String' does not have a default constructor 问题

ruby-on-rails - 在 ruby​​ on rails 中访问数组中散列中的值

c# - C# 中的 BitmapSource 对象出现问题

c# - 在 visual studio 上使用 c#、mvc 管理我的用户

java - 在java中用二维数组绘制数字钻石