嵌套的泛型接口

本文关键字:泛型接口 嵌套 | 更新日期: 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
}

它解决了目的吗?