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