gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:31:13 25 4
gpt4 key购买 nike

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

    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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com