为什么匿名类型数组中不允许使用隐式属性名?

时间:2019-02-06 23:20:30

标签: c# anonymous-types

为什么不允许这样做?

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

3 个答案:

答案 0 :(得分: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) };

答案 1 :(得分:6)

可以这样做,尽管我不知道您应该

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

这是有效的,并且可以很好地编译,并且使用起来非常非常困难。我强烈建议您不要这样做。

由于无法使用隐式初始化语法的原因,规范12.6中对数组初始化器有这样的说明:

  

对于一维数组,数组初始值设定项必须包含与数组的元素类型赋值兼容的一系列表达式。表达式从索引零的元素开始以递增顺序初始化数组元素。

(重点是我的)

因此,您的两个匿名类型之间没有兼容的类型,而且它们都是匿名的。

答案 2 :(得分:3)

或者另外一种情况(除了其他答案):

{{1}}

在这种情况下,您将创建一个隐式类型对象的数组,每个对象都有两个整数属性,一个名为A,另一个名为B。