嵌套的泛型接口
本文关键字:泛型接口 嵌套 | 更新日期: 2023-09-27 17:56:01
我有一个如下所示的接口架构(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 个类型参数
由于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 { ... }
在第一种情况下,对类型参数的限制当然更严格。
C 看起来像 Generic Generic 类型(因为缺乏更好的词)。
C的这个定义会起作用吗?
public interface C<T,U> where T : B<U> where U : A
{
List<T> b{ get; set; }
}
由于接口B
中的泛型类型只能是类型A
的实例,因此在接口C
中您需要声明类型B<A>
的T
:
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; }
}
这是因为您有一个<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
,然后你就没事:)
你可以在这里再添加一个接口,比如
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
}
它解决了目的吗?