Какая польза от возврата динамического в C #

... по сравнению с простым возвратом объекта. Магия начинается, когда вы назначаете объект динамически объявленной переменной, так что же имеет значение возвращение динамической переменной?

Итак, в чем разница между:

static object CreateMagicList()
{
    return new List<string>();
}

и

static dynamic CreateMagicList()
{
    return new List<string>();
}

Кажется, что они оба работают одинаково, например:

dynamic list = CreateMagicList();
list.Add( "lolcat" );

Обратите внимание, что это не практический вопрос. Меня интересует, почему часть :)


person Dirk Boer    schedule 25.05.2013    source источник
comment
См .: stackoverflow.com/questions/253460/   -  person Bruno    schedule 25.05.2013
comment
Кроме того, вы можете найти этот пост в MSDN, который стоит прочитать: blogs.msdn.com/b/csharpfaq/archive/2010/01/25/   -  person Justin Helgerson    schedule 25.05.2013
comment
Я знаю, как пользоваться динамиком, прочтите пожалуйста вопрос :)   -  person Dirk Boer    schedule 25.05.2013
comment
Насчет очевидного: CreateMagicList (). Add (lolcat); не будет компилироваться, если возвращает объект.   -  person dlev    schedule 25.05.2013
comment
@ user2246674 - конечно, но моя точка зрения состоит в том, чтобы объявить метод, возвращающий динамические выражения, означающие, что выражения, включающие только метод, обрабатываются как динамические без присваивания вообще.   -  person dlev    schedule 25.05.2013


Ответы (3)


Я предполагаю, что вам разрешено вернуть dynamic, чтобы вы могли сделать это:

private static dynamic Get() {
    return new {X=5};
}
public static void Main() {
    var v = Get();
    Console.WriteLine(v.X);
}

Если бы вы могли объявить Get только как object Get(), то вызывающие абоненты были бы вынуждены заменить var на dynamic: в противном случае код не скомпилировался бы.

То же самое касается варианта использования без var:

public static void Main() {
    Console.WriteLine(Get().X);
}

без типа возврата dynamic вам пришлось бы выполнить промежуточное присвоение или использовать приведение к dynamic.

person Sergey Kalinichenko    schedule 25.05.2013
comment
@ user2246674 Какая переменная-член? Здесь не задействованы никакие переменные-члены, только локальная переменная v. - person Sergey Kalinichenko; 25.05.2013
comment
@ user2246674 Я не могу придумать другого, что вы не смогли бы сделать, не разрешив возвращаемый тип dynamic. Я не думаю, что разработчики компилятора думали конкретно об этом варианте использования - они разрешили это, потому что могли делать это, по сути, бесплатно. Вероятно, было дешевле разрешить это, чем вводить особый случай, запрещающий использование dynamic в качестве типа возвращаемого значения метода. - person Sergey Kalinichenko; 25.05.2013
comment
Это звучит как справедливое объяснение. Это также приводит к Get().X использованию без какой-либо промежуточной переменной, что, я думаю, еще больше сократит разницу. - person user2246674; 25.05.2013

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

static dynamic CreateMagicList()
{
    return new List<string>();
}

List<string> list = CreateMagicList();
list.Add( "lolcat" );

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

но это

static object CreateMagicList()
{
    return new List<string>();
}

 List<string> list = CreateMagicList();
    list.Add( "lolcat" );

выдаст вам ошибку, так как вам нужно распаковать его

person COLD TOLD    schedule 25.05.2013
comment
В этом примере дан dynamic list = CreateMagicList9); list.Add( "lolcat" ); - какой смысл иметь динамический возвращаемый тип по сравнению с возвращаемым типом объекта и назначать его переменной с динамической типизацией перед использованием? - person user2246674; 25.05.2013
comment
как я уже сказал, выбор конкретной ситуации - person COLD TOLD; 25.05.2013

Вы можете вернуть динамику, чтобы в будущем вы могли действительно вернуть динамику. С перегрузкой MissingMethodInvoke и MissingPropertyInvoke. Динамика - это больше, чем просто объекты.

person Bill Gregg    schedule 25.05.2013