Я программировал в предположении, что при вызове метода в С# 4.0 предоставление имен для ваших аргументов не повлияет на результат, если только вы не пропустили один или несколько необязательных параметров.
Итак, я был немного удивлен, обнаружив следующее поведение:
Учитывая метод, который принимает Func<T>
, выполняет его и возвращает результат:
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");
компилятор С# сообщит об этой ошибке:
Аргументы типа для метода "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);
}
Кстати, я наблюдал такое же поведение с нестатическими методами. Я просто решил использовать статические методы, чтобы сделать здесь пример немного короче.