일반 오버로딩이 허용되지 않는 이유가 궁금하고 "모호한"해결책의 컴파일러 오류가 발생합니다. 명시 적으로있는 것은 고려해야 할 인터페이스를 선언,일반 오버로드가 모호한 이유는 무엇입니까?
class Program
{
static void Main(string[] args)
{
var p = new Program();
p.DoWork(new First());
p.DoWork(new Second());
p.DoWork(new Multi()); //ambiguous: that's right!
p.Test<IFirst>(new First()); //ambiguous???
}
private void DoWork(IFirst arg) { }
private void DoWork(ISecond arg) { }
private void Test<T>(T arg) where T : IFirst { }
private void Test<T>(T arg) where T : ISecond { }
}
interface IFirst { }
interface ISecond { }
class First : IFirst { }
class Second : ISecond { }
class Multi : IFirst, ISecond { }
내가 명시 적 형태 (DoWork) 및 일반 하나의 차이를 느낄 수 없습니다입니다 : 여기
는 샘플 코드입니다. 첫 번째 이유는 허용되며 두 번째 것은 허용하지 않는 이유는 무엇입니까?저의 목표는 똑같이 행동하는 두 가지 "테스트"방법을 사용하는 것입니다.하지만 정확하지는 않습니다.
모든 해결 방법 (다른 방식으로 이름을 지정하는 것 외에)?
미리 감사드립니다.
오케이. 이 기사에서는 제한 사항을 설명하지만 왜 해결할 수 없는지 이해하려고 노력하고 있습니다. 그러나 필자의 견해에 따르면 실제로 이상하게 보입니다. 컴파일러는 generic을 고려하기 위해 "시도한"경우에만 올바른 방법을 결정하는 데 문제가 없어야합니다. 해결할 수없는 문제보다 훨씬 더 많은 컴파일러 제한이 있습니다. 확실하지 않은 버그. –
@Mario : 분명히 이것을 해결할 수있을 것입니다. 이런 식으로 구현하는 것은 디자인 결정이었습니다. –