Подтвердить что ты не робот

Могут ли параметры метода быть динамическими в С#

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

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

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

4b9b3361

Ответ 1

Да, вы можете это сделать абсолютно. Для целей статического разрешения перегрузки он рассматривается как параметр 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");
    }
}

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

Ответ 3

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

Тип:
        ...
      dynamic

Это включает определения параметров, конечно.