2014-05-12 5 views
6

다음 예제에서는 일반 클래스 FoobarList<T>의 T 유형에 FoobarIFoobar<T>이라는 두 가지 제약 조건이 있습니다. 그러나 컴파일러는 오류를 제공합니다. 암시 적으로 'Foobar'유형을 'T'로 변환 할 수 없습니다. 명시 적 변환이 존재한다 (당신은 캐스트를 누락?)제네릭 형식 매개 변수에 대한 여러 제약 조건의 우선 순위

interface IFoobar<T> 
{ 
    T CreateFoobar(); 
} 

class Foobar : IFoobar<Foobar> 
{ 
    //some foobar stuffs 
    public Foobar CreateFoobar() { return new Foobar(); } 
} 

class FoobarList<T> where T : Foobar, IFoobar<T> 
{ 
    void Test(T rFoobar) 
    { 
     T foobar = rFoobar.CreateFoobar(); //error: cannot convert Foobar to T 
    } 
} 

컴파일러가 IFoobar의 하나는 foobar의 방법,하지만 같은 CreateFoobar을 고려 보인다. 다음 I은베이스 클래스 FoobarBase으로는 foobar 분할하고, 그 유도 된 클래스 인터페이스 IFoobar를 구현하여 컴파일 해결할 수 : 두 부류로는 foobar 분할 복잡

interface IFoobar<T> 
{ 
    T CreateFoobar(); 
} 

abstract class FoobarBase 
{ 
    //some foobar stuffs 
} 

class Foobar : FoobarBase, IFoobar<Foobar> 
{ 
    public Foobar CreateFoobar() { return new Foobar(); } 
} 

class FoobarList<T> where T : FoobarBase, IFoobar<T> 
{ 
    void Test(T rFoobar) 
    { 
     T foobar = rFoobar.CreateFoobar(); 
    } 
} 

. 이 문제를 해결할 더 좋은 방법이 있습니까?

+1

인터페이스를 명시 적으로 구현하는 것이 도움이됩니까? – Rotem

답변

4

그냥 IFoobar<T>rFoobar 캐스트 : 당신이 T보다는 Foobar 반환하는 메소드를 호출하고

T foobar = ((IFoobar<T>)rFoobar).CreateFoobar(); 

그런 식으로. 로템에서 알 수 있듯이, Foobar의 방법을 변경하면 명시 적 인터페이스 구현을 사용할 수

도 작동합니다

Foobar IFoobar<Foobar>.CreateFoobar() { return new Foobar(); } 

그 방법은 T에서 찾을 수 없습니다 그 방법은, 그래서 다시는 인터페이스 방법으로 해결됩니다.

관련 문제