为什么隐含属性名称不匿名类型的数组允许吗?

问题描述 投票:6回答:3

为什么没有这可以吗?

int A = 5, B = 10, X = 5, Y = 5;
var array = new[] { new { A, B }, new { X, Y } };

当我尝试编译,我得到:

CS0826:发现隐式类型数组没有最好的类型

感觉有点反直觉的,因为常规的匿名类型,我可以这样做:

int X = 5, Y = 5;
var point = new { X, Y };
c# anonymous-types
3个回答
6
投票

你可以这样做,但我不知道,你应该做的。

int A = 5, B = 10, X = 5, Y = 5;
var array = new object[] { new { A, B }, new { X, Y } };

这是有效的,并且将编译就好了,而且是非常,非常难用。我强烈反对这样做。

至于为什么使用隐式初始化语法不起作用,该规范已经这样说,数组的初始化的12.6原因:

对于一维数组,数组初始化必须包括那些分配与阵列的元素类型兼容表达式序列的。表达式按照递增顺序,在索引零与所述元素开始初始化数组元素。

(重点煤矿)

因此,有没有你的两个匿名类型的,那么,他们是匿名之间的兼容型。


7
投票

你要么需要在您的匿名类型隐含指定属性的名称,或使用对象的数组

var array = new[] { new { val1= A, val2=B }, new { val1=X, val2=Y } };

要么

var array = new object [] { new { A, B }, new { X, Y } };

但是让我们此基础上更进一步,并使用元组yehaa,更短的语法,类型,以及更简洁

var array = new[] { (A, B), (X, Y) };

或命名元组,世界上最好的

var array = new (int something ,int another)[] { (A, B), (X, Y) };

3
投票

或更多的情况(除了其他的答案):

int A = 5, B = 10, X = 5, Y = 5;
var array = new[] { new { A, B }, new { A=X, B=Y } };

在这种情况下要创建隐式类型对象的阵列,其中的每一个具有两个整数属性,一个命名为A,另一个名为B.

© www.soinside.com 2019 - 2024. All rights reserved.