嵌套通用接口

时间:2013-01-24 09:25:46

标签: c# generics interface

我有一个接口模式,如下所示(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个类型参数

5 个答案:

答案 0 :(得分:10)

由于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 :(得分:1)

C看起来像Generic Generic类型(缺少更好的单词)。

这个C的定义会改变吗?

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

答案 2 :(得分:1)

由于接口B中的泛型类型只能是A类型的实例,因此在接口C中,您需要声明类型为T的{​​{1}}:

B<A>

答案 3 :(得分:1)

这是因为当<List<T>> T B<T>List<B>时,您需要为B指定类型public interface C<T, T2> where T : B<T2> where T2 : A { List<T> b { get; set; } } }}。这就是你错误的原因。

T2

A投射到{{1}},然后你会没事的。)

答案 4 :(得分: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
}

它解决了目的吗?