2013-01-24 3 views
7

나는 다음 (C# .NET4)와 같은 인터페이스의 스키마를중첩 된 제네릭 인터페이스

interface A 
{ 

} 

interface B 
{ 
    List<A> a; 
} 

interface C 
{ 
    List<B> b; 
} 

와 나는이 방법으로 그것을 구현 오류 제네릭 형식 'B'를 사용하려면 1 개의 형식 인수가 필요합니다.

+1

인터페이스를 구현하지 않습니다 ... – Maarten

+0

잘못된 동사를 사용했습니다. :) 기본적으로 모든 asnwers가 좋습니다. 모두 감사합니다. – Davide

답변

7

interface B<T>은 일반 형식이기 때문에 공식 형식 인수를 제공해야합니다 interface C<T>을 선언 할 때 즉, 현재 문제는 컴파일러가 인터페이스 B 인터페이스 C가 "상속받는"유형을 알리지 못한다는 것입니다.

두 개의 T은 반드시 같은 유형을 나타내는 것은 아닙니다. 그들은

public interface C<T> where T : B<T>, A { ... } 

에서와 같이 동일한 유형이 될 수도 있고 두 가지 종류가 될 수 있습니다

public interface C<T, U> where T : B<U> where U : A { ... } 

유형 인수에 대한 제한은 물론 엄격한 첫 번째 경우에 있습니다.

1

C는 일반용 유형 (더 나은 단어가 부족함)처럼 보입니다.

이 C 정의가 대신 작동합니까? 인터페이스 B에서 제네릭 형식 이후

public interface C<T,U> where T : B<U> where U : A 
{ 
    List<T> b{ get; set; } 
} 
1

는 인터페이스 C 당신이 유형 B<A>T를 선언 할 필요가 입력 A의 인스턴스가 될 수 있습니다

public interface A { } 
public interface B<T> where T : A 
{ 
    List<T> a { get; set; } 
} 
public interface C<T> where T : B<A> 
{ 
    List<T> b { get; set; } 
} 
1

이렇게하면 <List<T>>T이 있기 때문입니다 예를 들어 B<T> 일 때 B의 유형을 지정해야하는 List<B>으로 표시됩니다. 이것이 귀하의 오류의 원인입니다.

public interface C<T, T2> where T : B<T2> 
    where T2 : A 
{ 
    List<T> b { get; set; } 
} 

A에 출연 T2 그리고 당신은 당신이 목적을 해결 않습니다

public interface A { } 
public interface B<T> where T : A 
{ 
    List<T> a { get; set; } 
} 
public interface BA : B<A> 
{ 
} 
public interface C<T> where T : BA 
{ 
    List<T> b { get; set; } // << ERROR: Using the generic type 'B<T>' requires 1 type arguments 
} 

처럼 여기 또 하나의 인터페이스를 추가 할 수 있습니다 :

1

잘 될 것입니다?

관련 문제