2011-02-02 9 views
5

나는 다음과 같은 수업을 내가 ExportFileBaseBL 클래스에서 방법을 비교 호출하려고하지만 오류를 얻을C#을 제네릭 - 제네릭 클래스에서 제네릭 메서드를 호출

암시 적으로 'T'로 유형 '클래스 1'을 변환 할 수 없습니다 . 명시 적 변환은 (당신이 캐스트를 누락?)

public abstract class Class1<T> where T: Class2 
{ 
    public abstract Class1<T> Compare(Class1<T> otherObj); 
} 

public abstract class Class3<T, U> where T: Class1<U> 
         where U: Class2 
{ 
    public T Compare(T obj1, T obj2) 
    { 
     if (obj1.Prop1 > obj2.Prop1) 
     { 
      return obj1.Compare(obj2); // Compiler Error here 
     } 
     else 
     { 
      return obj2.Compare(obj1); // Compiler Error here 
     } 
    } 

} 

하는 유형 변환이 암시 있어야하지 존재? 내가 놓친 게 있니?

답변

4

문제는 추상적 인 Compare 방법은 유형 Class1<T>의 매개 변수를 수락하고를 반환하도록 정의된다 예를 들어 Class1<T>, 보다 구체적으로는 유형 Class1<T>이 아닙니다. 그러나 이것이 사용자의 Class3.Compare 메소드가 시도하는 것입니다. T.Compare을 호출하고 이 출력 될 것이라고 가정하십시오. 실제로는 Class1<U> 일뿐입니다.

는 더 간단하고 이해하기 쉬운 예를 제공 I이 클래스 있다고 가정합니다 : intobject에서 파생해서 parser.Parseint가 반환 :

class Parser 
{ 
    public abstract object Parse(string text); 
} 

class Int32Parser 
{ 
    public int Parse(Parser parser, string text) 
    { 
     return parser.Parse(text); 
    } 
} 

위의 코드는 자신의 유사한 결함 가정을 만든다을 (귀하의 경우와 마찬가지로 TClass1<U>에서 파생되어야합니다.); 실제로는 object을 반환 할 것만 확신 할 수 있습니다.

이 문제를 해결하기 위해 내가 볼 수있는 두 가지 방법이 있습니다 : Class1<T>.Compare에게 일반적인 방법합니다

public abstract U Compare<U>(U otherObj) where U : Class1<T>; 

을 ... 또는 Class3.Compare 메소드의 반환 값의 형태 특이성 휴식 :

public Class1<U> Compare(T obj1, T obj2) 
{ 
    // ... 
} 

처음에는 절대적으로 필요하지 않으면 개인적으로 두 번째를 선호합니다. 이러한 모든 일반적인 유형 제약 조건은 매우 복잡해질 수 있으며 복잡성이 이렇게 커지기 시작하면 예상보다 많은 부담을 줄 수 있습니다.

+0

감사합니다 댄, 내 질문에 대한 답변. – logik6

+0

Jup jup, 비교 메서드 입력에 대한 업데이트가 추가되었으므로 답변에 동의합니다. – jcolebrand

2

클래스 수준에서 선언 한 매개 변수 유형으로 메소드를 호출하십시오.

return obj1.Compare<T>(obj2); 

당신은 확인해야합니다 일반뿐만 아니라 방법을 비교의 정의 :

public abstract Class1<T> Compare<T>(Class1<T> otherObj); 
+1

Compare 메서드는 일반 형식이 아니므로 현재 형식의 형식 매개 변수를 사용할 수 없습니다. –

+0

그러나 @Kyle은 부모 코드에서 어디에 고정해야 하는지를 보여줍니다. 그는 또한 첫 번째 클래스 비교 메소드에 ''을 추가해야합니다. – jcolebrand

+0

그런 다음 그 대답에 추가해야합니다. 나는 그것을 추가 할 것이다. –