Почему неявные имена свойств не допускаются в массиве анонимных типов? - PullRequest
0 голосов
/ 07 февраля 2019

Почему это не разрешено?

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 голосов
/ 07 февраля 2019

Вы можете сделать это, хотя я не знаю, что вам следует .

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

Это допустимо, и скомпилируется просто отлично, ибыть очень, очень сложным в использовании.Я настоятельно рекомендую не делать этого.

Что касается причины, по которой использование неявного синтаксиса инициализации не работает, в 12.6 спецификации сказано об инициализаторах массива:

ДляВ одномерном массиве инициализатор массива должен состоять из последовательности выражений, которые совместимы по присваиванию с типом элемента массива .Выражения инициализируют элементы массива в порядке возрастания, начиная с элемента с нулевым индексом.

(выделение мое)

Так что нет совместимого типа между вашими двумя анонимными типами, так как, ну, они анонимны.

0 голосов
/ 07 февраля 2019

Или еще один случай (в дополнение к другим ответам):

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

В этом случае вы создаете массив неявно типизированных объектов, каждый из которых имеет два целочисленных свойства, одно из которых называется A,другой по имени Б.

0 голосов
/ 07 февраля 2019

Вам нужно будет либо неявно указывать имена свойств в ваших анонимных типах, либо использовать массив объектов

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