Почему нельзя использовать свойства анонимных типов в массивах? - PullRequest
4 голосов
/ 22 апреля 2019

Я знаю, что в C # я могу объявить массив анонимных типов следующим образом:

var anons = new[]
{
    new { name = "" , something = ""},
    new { name = "", something = "" }
};

Я могу понять, что все объекты должны иметь одинаковые свойства, иначе никто не сможет перебирать их и использовать такие свойства, как:

foreach (var anon in anons)
{
    Console.WriteLine(anon.name);
}

Но я не понимаю, , почему их свойства должны иметь одинаковый порядок?

Например, следующий код не будет компилироваться:

var anons = new[]
{
    new { name = "" , something = ""},
    new { something = "", name = "" }
};

Почему это не разрешено, поскольку в нормальном объекте свойства могут быть объявлены независимо от их порядка, и остальная часть кода может использовать их, как это происходит прямо сейчас?

Ответы [ 2 ]

7 голосов
/ 22 апреля 2019

Из документации по анонимным типам: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/anonymous-types

Если два или более инициализатора анонимных объектов в сборке задают последовательность свойств, которые находятся в одном порядке и имеют одинаковые имена и типы , компилятор обрабатывает объекты как экземпляры одного типа , Они используют одну и ту же информацию о типах, сгенерированную компилятором.

Другими словами, вы создаете два анонимных типа, и последовательность имен свойств и типов свойств не совпадают. Они выглядят почти одинаково для нас, но компилятор видит их как два разных типа, что означает, что он не может вывести один тип для объявления массива.

0 голосов
/ 22 апреля 2019

Несмотря на то, что ответ, данный Скоттом, является практически правильным, он не отвечает на вопрос почему полностью.Поскольку этот вопрос больше касается дизайна компилятора в отношении массива анонимных типов, и большинство из нас не может прийти к четкому ответу, я оставлю вопрос открытым и отложу принятие ответа до тех пор, пока кто-нибудь не ответит на почему вопрос.А пока я оставлю здесь следующую теорию:

К вопросу

почему их свойства должны иметь одинаковый порядок?

Почему бы и нет?

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

В противоположность этому, изменение порядкасвойства анонимного объекта в объектах массива анонимных типов могут вводить в заблуждение, и ради согласованности следует избегать.В этом случае должно отображаться предупреждение или, по крайней мере, сообщение для программистов, которые пытаются поменять свойства объектов таким образом, так почему бы не сделать это с самого начала ошибкой и убрать необходимость сделать компилятор C # умнымдостаточно разобраться в свойствах.

В заключение: Наличие свойств всегда в одном и том же порядке - это не отсутствующая функциональность, а особенность.

...