我有一个接口模式,如下所示(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个类型参数
答案 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
}
它解决了目的吗?