Могут ли параметры метода быть динамическими в C # - PullRequest
34 голосов
/ 12 ноября 2009

В c # 4.0 возможны ли параметры динамического метода, как в следующем коде?

public string MakeItQuack(dynamic duck)
{
  string quack = duck.Quack();
  return quack;
}

У меня есть много интересных примеров динамического ключевого слова в C # 4.0, но не как выше. Этот вопрос, конечно же, вдохновлен тем, как работает python.

Ответы [ 4 ]

44 голосов
/ 12 ноября 2009

Да, вы можете сделать это абсолютно. В целях разрешения статической перегрузки он рассматривается как параметр object (и вызывается статически). То, что вы делаете в методе, будет динамичным. Например:

using System;

class Program
{
    static void Foo(dynamic duck)
    {
        duck.Quack(); // Called dynamically
    }

    static void Foo(Guid ignored)
    {
    }

    static void Main()
    {
        // Calls Foo(dynamic) statically
        Foo("hello");
    }
}

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

4 голосов
/ 12 ноября 2009
2 голосов
/ 12 ноября 2009

Да, вы можете сделать это. Как указано в спецификации C # 4.0, грамматика расширена для поддержки dynamic везде, где ожидается тип :

Тип
...
dynamic

Разумеется, сюда входят определения параметров.

0 голосов
/ 12 ноября 2009

Да; см. например

http://blogs.msdn.com/cburrows/archive/2008/11/14/c-dynamic-part-vi.aspx

или другие блоги Криса. Или захватите VS2010 Beta2 и попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...