2013-01-24 16 views
7

mam schematu interfejsów jak poniżej (C# .NET4)zagnieżdżone interfejsy generyczne

interface A 
{ 

} 

interface B 
{ 
    List<A> a; 
} 

interface C 
{ 
    List<B> b; 
} 

i wprowadziły go w ten sposób:

public interface A 
{ 

} 

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

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

nie wiem, jak uniknąć błąd Korzystanie z uniwersalnym typem „b” typu 1 wymaga argumentów

+1

Nie implementujesz żadnych interfejsów ... – Maarten

+0

Użyłem złego czasownika :) .. w zasadzie wszystkie asnwersy są dobre, dziękuję wszystkim – Davide

Odpowiedz

7

Od interface B<T> jest nazwą rodzajową, trzeba dostarczyć formalny typ argumentu dla niego podczas deklarowania interface C<T>. Innymi słowy, obecny problem polega na tym, że nie mówisz kompilatorowi, z jakiego typu interfejsu B "dziedziczy" interfejs.

Dwa numery T niekoniecznie odnoszą się do tego samego typu. Mogą być tego samego typu, jak w

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

lub mogą być dwa różne typy:

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

Ograniczenia typu argumentem są oczywiście mocniej w pierwszym przypadku.

1

C wygląda jak ogólny rodzajowy (z braku lepszego słowa).

Czy ta definicja C działałaby w zamian?

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

od typu rodzajowego w interfejsie B może być instancją typu A tylko w interfejsie C trzeba zadeklarować T typu B<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

To dlatego, że masz <List<T>> gdzie T jest B<T> w momencie, gdy masz go jako List<B>, gdzie musisz określić typ dla B. To jest powód twojego błędu.

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

Obsada T2 do A i wtedy będzie dobrze :)

1

można dodać jeszcze jeden interfejs tutaj jak

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 
} 

to rozwiązać zadanie?