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