다음 예제에서는 일반 클래스 FoobarList<T>
의 T 유형에 Foobar
및 IFoobar<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();
}
}
. 이 문제를 해결할 더 좋은 방법이 있습니까?
인터페이스를 명시 적으로 구현하는 것이 도움이됩니까? – Rotem