Именованные аргументы и вывод универсального типа в C # 4.0

Я программировал в предположении, что при вызове метода в C # 4.0 указание имен для ваших аргументов не повлияет на результат, если только в d Таким образом, вы «пропустили» один или несколько дополнительных параметров.

Поэтому я был немного удивлен, обнаружив следующее поведение:

Учитывая метод, который принимает Func , выполняет его и возвращает результат:

public static T F<T>(Func<T> f)
{
    return f();
}

И еще один метод, из которого виден вышеуказанный метод:

static void Main()
{
    string s;

вызов F (без именованных аргументов) компилируется без каких-либо проблем:

    s = F<string>(() => "hello world"); // with explicit type argument <string>
    s = F(() => "hello world"); // with type inference

И при использовании именованного аргумента ...

    s = F<string>(f: () => "hello world");

. .. приведенная выше строка кода, использующая явный аргумент типа, все еще компилируется без проблем. И, возможно, не слишком удивительно, если у вас установлен ReSharper, он предложит, что «Спецификация аргумента типа избыточна».

Однако при удалении аргумента типа ...

    s = F(f: () => "hello world");

компилятор C # сообщит об этой ошибке:

Аргументы типа для метода Program.F (System.Func) не могут быть выведены из использования. Попробуйте явно указать аргументы типа.

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

Это поведение задокументировано где-нибудь в спецификации языка?

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

Чтобы сделать вещи более интересными, я обнаружил, что все следующие компоненты компилируются без проблем:

    Func<string> func = () => "hello world";
    s = F<string>(func);
    s = F(func);
    s = F<string>(f: func);
    s = F(f: func);
}

Кстати, я наблюдал такое же поведение с нестатическими методами. Я просто решил использовать статические методы, чтобы сделать пример здесь немного короче.

57
задан Mark Hurd 6 July 2011 в 10:43
поделиться