12

我有如下接口架构(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 个类型参数

4

5 回答 5

10

由于interface B<T>是泛型的,因此在声明interface C<T>. 换句话说,当前的问题是您没有告诉编译器接口 B 接口 C “继承”的类型。

这两个Ts 不一定指的是同一类型。它们可以是相同的类型,如

public interface C<T> where T : B<T>, A { ... }

或者它们可以是两种不同的类型:

public interface C<T, U> where T : B<U> where U : A { ... }

在第一种情况下,对类型参数的限制当然更严格。

于 2013-01-24T09:28:36.190 回答
1

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

这个 C 的定义会起作用吗?

public interface C<T,U> where T : B<U> where U : A
{
    List<T> b{ get; set; } 
}
于 2013-01-24T09:30:05.437 回答
1

由于接口中的泛型类型B只能是类型的实例A,因此在接口中C您需要声明T类型B<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; } 
}
于 2013-01-24T09:30:55.413 回答
1

这是因为你现在有一个<List<T>>where TisB<T>List<B>需要为它指定一个类型的地方B。这就是你的错误的原因。

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

投到然后你会没事的T2:)A

于 2013-01-24T09:30:59.733 回答
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
}

它解决了目的吗?

于 2013-01-24T09:33:19.250 回答