У меня есть сценарий, в котором я хочу использовать синтаксис группы методов, а не анонимные методы (или синтаксис лямбда) для вызова функции.
Функция имеет две перегрузки: одну, которая принимает Action
, а другая принимает Func<string>
.
Я могу с радостью назвать две перегрузки с использованием анонимных методов (или синтаксиса лямбда), но получить компиляторную ошибку для неоднозначного вызова, если я использую синтаксис группы методов. Я могу обойти это путем явного перевода на Action
или Func<string>
, но не думаю, что это необходимо.
Может кто-нибудь объяснить, зачем нужны явные приведения.
Пример кода ниже.
class Program
{
static void Main(string[] args)
{
ClassWithSimpleMethods classWithSimpleMethods = new ClassWithSimpleMethods();
ClassWithDelegateMethods classWithDelegateMethods = new ClassWithDelegateMethods();
// These both compile (lambda syntax)
classWithDelegateMethods.Method(() => classWithSimpleMethods.GetString());
classWithDelegateMethods.Method(() => classWithSimpleMethods.DoNothing());
// These also compile (method group with explicit cast)
classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString);
classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing);
// These both error with "Ambiguous invocation" (method group)
classWithDelegateMethods.Method(classWithSimpleMethods.GetString);
classWithDelegateMethods.Method(classWithSimpleMethods.DoNothing);
}
}
class ClassWithDelegateMethods
{
public void Method(Func<string> func) { /* do something */ }
public void Method(Action action) { /* do something */ }
}
class ClassWithSimpleMethods
{
public string GetString() { return ""; }
public void DoNothing() { }
}