아래 코드에서는 Bar
이라는 두 가지 오버로드 된 메서드를 정의했습니다. Foo()
에서 나는 Bar
으로 3 번 전화를 걸고 세 번째 전화에서 오류가 발생합니다.매개 변수 배열이있는 일반 C# 메서드 오버로드 해결
처음 두 개는 예상되는 과부하를 해결합니다. 분명히 세 번째 호출이 "() 바"에 바인딩하지만 예외에 첫 번째 매개 변수를 변환하는 데 실패
The type 'string' cannot be used as type parameter 'T' in the generic type or method 'Bar<T>(T, string, params object[])'. There is no implicit reference conversion from 'string' to 'System.Exception'.
: 세 번째는 그러나 다음과 같은 오류를 생성합니다. 그것은 컴파일러를 버리는 문자열이라는 두 번째 인수라는 것도 분명합니다. 문자열이 아닌 경우 (케이스 2) 해상도가 좋습니다. 하지만 실패한 줄이 "Bar()"에 바인딩되어야한다는 것이 분명합니다 (첫 번째 매개 변수는 명확하게 문자열이므로).
컴파일러가이 바인딩을 사용하는 이유는 누구나 설명 할 수 있습니까? 나는 창조적 인 해결 방법을 고려할 것입니다. 그러나 제가 정말로 찾고있는 것은 왜 이것이 일어나고 있는지에 대한 설명입니다. C# 언어 사양으로 시간을 보냈지 만 명확한 대답을 찾지 못했습니다 (예 : 포기). 분명히 Bar
메서드 중 하나의 이름을 바꾸거나 명명 된 인수를 제공하거나 ref
매개 변수 중 하나를 표시 할 수는 있지만 이러한 특정 시나리오에는 이상적이지 않습니다.
아니지만 그것은 관련이 있지만 정확히이 일을 자바 코드를 작성하고 컴파일러는 아무런 문제가 없었다.
코드 :
public void Bar(string s, params object[] ps) { } // Call this "Bar()"
public void Bar<E>(E e, string s, params object[] ps) where E : Exception { } // Call this "Bar<T>()"
public void Foo()
{
Exception e;
Object o1, o2;
Bar(e, "fmt {0}", o); // Resolves fine, as expected
Bar("fmt {0} {2}", o1, o2); // Also resolves as expected
Bar("fmt {0} {2}", "bar", o1); // Error!
}
유사 항목 : http://stackoverflow.com/questions/965423/c-sharp-generic-overload-compiler-cant-determine-correct-call – Travis
하지만 그 질문은 모호성을 다루고 있습니다. 이 경우 컴파일러와 바인딩에 동의합니다. 우리는 어느 것에 동의하지 않습니다! – pamphlet