Почему я не могу сделать это: dynamic x = new ExpandoObject {Foo = 12, Bar = «двенадцать»}

Я делаю что-то не так, или следующий код действительно невозможен?

dynamic x = new ExpandoObject { Foo = 12, Bar = "twelve" };

Если это действительно невозможно, есть ли здесь еще один однострочный способ создания экземпляра ExpandoObject с двумя свойствами?

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

Обновление

Я спросил этот вопрос, потому что я пытался показать энтузиасту Pearl новые крутые динамические функции C #, но затем я был остановлен из-за невозможности сделать то, что я считал логическим экземпляром ExpandoObject . Благодаря ответу Ханса Пассанта я понял, что ExpandoObject был неподходящим инструментом для работы. Моя настоящая цель состояла в том, чтобы использовать динамические функции C # для возврата двух именованных значений из метода. Как указывает Ханс, ключевое слово dynamic идеально для этого. Для этого мне не нужен был ExpandoObject со всеми его накладными расходами.

Итак, если вы хотите вернуть пару именованных значений из метода и не беспокоитесь о безопасности типов, Intellisense, рефакторинге или производительности, это отлично работает:

public dynamic CreateFooBar()
{
    return new { Foo = 42, Bar = "Hello" };
}

Использование:

dynamic fooBar = CreateFooBar();
var foo = fooBar.Foo;
var bar = fooBar.Bar;
60
задан devuxer 20 September 2011 в 20:49
поделиться