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

Dum*_*ode 6 c# anonymous-types

为什么不允许这样做?

int A = 5, B = 10, X = 5, Y = 5;
var array = new[] { new { A, B }, new { X, Y } };
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我得到:

CS0826:找不到隐式类型数组的最佳类型

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

int X = 5, Y = 5;
var point = new { X, Y };
Run Code Online (Sandbox Code Playgroud)

AAA*_*ddd 7

您将需要隐式指定匿名类型中的属性名称,或使用对象数组

var array = new[] { new { val1= A, val2=B }, new { val1=X, val2=Y } };
Run Code Online (Sandbox Code Playgroud)

要么

var array = new object [] { new { A, B }, new { X, Y } };
Run Code Online (Sandbox Code Playgroud)

但是让我们更进一步,使用Tuples yehaa,更短的语法,打字,更简洁

var array = new[] { (A, B), (X, Y) };
Run Code Online (Sandbox Code Playgroud)

或命名元组,最好的世界

var array = new (int something ,int another)[] { (A, B), (X, Y) };
Run Code Online (Sandbox Code Playgroud)


Jon*_*ase 6

可以这样做,虽然我不知道你应该这样做.

int A = 5, B = 10, X = 5, Y = 5;
var array = new object[] { new { A, B }, new { X, Y } };
Run Code Online (Sandbox Code Playgroud)

这是有效的,并且编译得很好,并且非常非常难以使用.我强烈建议不要这样做.

至于使用隐式初始化语法不起作用的原因,规范的12.6有关于数组初始化器的说法:

对于一维数组,数组初始值设定项必须由一系列表达式组成,这些表达式与数组的元素类型兼容.表达式以递增的顺序初始化数组元素,从索引为零的元素开始.

(强调我的)

所以你的两个匿名类型之间没有兼容的类型,因为它们是匿名的.