2014-02-06 1 views
2

는 다음과 같은 코드를 가지고 :방법 과부하가 아닌 일반적인 방법

The type 'DerivedClassA1' cannot be used as type parameter 
'TBaseClassB' in the generic type or method 
'Operations.Method<TBaseClassB>(TBaseClassB)'. 
There is no implicit reference conversion from 'DerivedClassA1' 
to 'BaseClassB'. 

그것은 나타납니다 라인은 다음과 같은 오류에 // Compilation error 결과를 표시

class BaseClassA { } 
class DerivedClassA1 : BaseClassA { } 

class BaseClassB { } 
class DerivedClassB1 : BaseClassB { } 

static class Operations 
{ 
    public static BaseClassA Method(BaseClassA baseA) 
    { 
     //... 
     return baseA; 
    } 

    public static TBaseClassB Method<TBaseClassB>(TBaseClassB baseB) 
     where TBaseClassB : BaseClassB, new() 
    { 
     //... 
     return baseB; 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      BaseClassA baseA = new BaseClassA(); 
      DerivedClassA1 derivedA1 = new DerivedClassA1(); 
      DerivedClassB1 derivedB1 = new DerivedClassB1(); 

      baseA = Operations.Method(baseA); 
      derivedA1 = Operations.Method(derivedA1); // Compilation error 
      derivedB1 = Operations.Method(derivedB1); 
     } 
    } 
} 

을 해당 메서드 오버로드는 인수가 DerivedClassA1 인 경우 Operations.Method(BaseClassA)과 반대로 Operations.Method<TBaseClassB>(TBaseClassB)메서드 오버로드를 선택합니다. 그것은 내가 기대하는 것과 반대입니다. 이유가 무엇인가요? 내가 뭔가 잘못하고 있는거야? 거기에 대안/올바른 방법을 달성 내가 원하는 무엇입니까 Method(BaseClassA) 메서드를 호출하는 것입니다 과부하.

예제 코드는 에서 작동하는 일부 실제 코드의 단순화 된 코드입니다. 예제가 고쳐 졌을 경우 사과드립니다.

답변

0

오버로드 분석은 이러한 제약 조건이 실제로 메서드 서명의 일부가 아니기 때문에 제네릭 제약 조건을 고려하지 않습니다. 제네릭 제약 조건 만 다른 동일한 클래스에서 동일한 메서드를 만들 수는 없습니다. 해결 알고리즘은 우선 가장 적합한 후보를 선택하고 제약 조건을 확인하는지 확인합니다. 당신이 where TBaseClassB : BaseClassB, new() 제약 조건을 무시하면 TBaseClassBDerivedClassA1 경우가 아닌 일반적인 것보다 더 가깝게 일치 (Method(DerivedClassA1)Method(BaseClassA)보다 가까운) 때문에 귀하의 경우에는

는 일반 과부하, 더 나은 후보입니다. 그러나 그런 다음 제약 조건을 확인하고 DerivedClassA1BaseClassB을 상속하지 않아 오류가 발생합니다.

즉, 제네릭 제약 조건을 확인하기 전에 비 제너릭 오버로드가 이미 제거되었습니다.