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)
您将需要隐式指定匿名类型中的属性名称,或使用对象数组
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)
你可以这样做,虽然我不知道你应该这样做.
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有关于数组初始化器的说法:
对于一维数组,数组初始值设定项必须由一系列表达式组成,这些表达式与数组的元素类型兼容.表达式以递增的顺序初始化数组元素,从索引为零的元素开始.
(强调我的)
所以你的两个匿名类型之间没有兼容的类型,因为它们是匿名的.