C# 嵌套泛型接口
我有一个如下所示的接口模式(C#.NET4)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; } /
接口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
}