Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套泛型接口_C#_Generics_Interface - Fatal编程技术网

C# 嵌套泛型接口

C# 嵌套泛型接口,c#,generics,interface,C#,Generics,Interface,我有一个如下所示的接口模式(C#.NET4) 接口A { } 接口B { 清单a; } 接口C { 名单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; } /

我有一个如下所示的接口模式(C#.NET4)

接口A
{
}
接口B
{
清单a;
}
接口C
{
名单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
}
公共接口A
{
}
公共接口B,其中T:A
{
列出一个{get;set;}
}
公共接口C,其中T:B
{
列表b{get;set;}/因为
接口b
是泛型的,所以在声明
接口C
时需要为它提供一个正式的类型参数。换句话说,当前的问题是,您没有告诉编译器接口C“继承”的接口b的类型

两个
T
s不一定指同一类型。它们可以是同一类型,如中所示

public interface C<T> where T : B<T>, A { ... }
公共接口C,其中T:B,A{…}
或者,它们可以是两种不同的类型:

public interface C<T, U> where T : B<U> where U : A { ... }
公共接口C其中T:B其中U:A{…}

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

C看起来像泛型类型(因为没有更好的词)

C的这个定义会起作用吗

public interface C<T,U> where T : B<U> where U : A
{
    List<T> b{ get; set; } 
}
公共接口C,其中T:B,其中U:A
{
列表b{get;set;}
}

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

公共接口A{}
公共接口B,其中T:A
{
列出一个{get;set;}
}
公共接口C,其中T:B
{
列表b{get;set;}
}

这是因为您有一个
,其中
T
B
,此时您将它作为
列表
,需要为
B
指定一个类型。这就是错误的原因

public interface C<T, T2> where T : B<T2>
  where T2 : A
{
  List<T> b { get; set; } 
}
公共接口C,其中T:B
式中T2:A
{
列表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
}
公共接口A{}
公共接口B,其中T:A
{
列出一个{get;set;}
}
公共接口BA:B
{ 
}
公共接口C,其中T:BA
{

列表b{get;set;}//您没有实现任何接口…我使用了错误的动词:)…基本上所有ASNWER都很好,谢谢大家
public interface C<T, T2> where T : B<T2>
  where T2 : A
{
  List<T> b { get; set; } 
}
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
}