2013-01-24 75 views
7

我的接口,如以下(C#.NET4)架構嵌套通用接口

interface A 
{ 

} 

interface B 
{ 
    List<A> a; 
} 

interface C 
{ 
    List<B> 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 
} 

我不知道如何避免錯誤使用通用類型'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的這個定義是否工作呢?

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

因爲接口B泛型類型只能是A類型的實例,在接口C需要聲明TB<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; } 
} 

演員T2A,然後你會被罰款:)

1

,你可以在這裏添加更多的接口像

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 
} 

它解決的目的是什麼?