함수를 호출하는 데 익명 메서드 (또는 람다 구문)가 아닌 메서드 그룹 구문을 사용하려는 시나리오가 있습니다.
이 함수에는 두 개의 오버로드가 있습니다. 하나는를, 다른 하나 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() { }
}
C # 7.3 업데이트
로 당 0xcde 2019 년 3 월 20 일에 아래의 코멘트 (나는이 질문을 게시 구년 후!), C # 7.3 감사의로이 코드를 컴파일 개선 과부하 후보 .