inheritance一个通用的基类,应用一个约束,并在C#中实现一个接口

这是一个语法问题。 我有一个通用的类inheritance自一个通用的基类,并正在对其中一个types参数应用约束。 我也希望派生类实现一个接口。 对于我的生活,我似乎无法弄清楚正确的语法。

这是我的:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... } 

首先想到的是这样的:

 DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... } 

但这是不正确的,因为这导致T2需要实现IBar和IFoo,而不是DerivedFoo来实现IFoo。

我尝试了一些谷歌search,使用冒号,分号等,但我已经缩短了。 我相信答案是头脑简单。

在定义通用约束之前,您需要包含整个类的签名。

 class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar { ... } 

我的build议是:当您对C#语言的语法有疑问时,请阅读规范; 这就是我们发布它的原因。 你会想要阅读第10.1节。

为了回答你的具体问题,类声明中事物的顺序是:

  • 属性,放在方括号中
  • 修饰符(“public”,“static”等)
  • “局部”
  • “类”
  • class级名称
  • 尖括号内的types参数声明的逗号分隔列表
  • 一个冒号后面跟着逗号分隔的基本types列表(基类和实现的接口,如果有的话基类必须先到达)
  • types参数约束
  • class级的身体,被括号包围
  • 一个分号

除了“class”,名称和正文外,该列表上的所有内容都是可选的,但是如果出现所有内容,则必须按照该顺序显示。

 public interface IFoo {} public interface IBar {} public class ParentFoo<T,T1> { } public class DerivedFoo<T, T1> : ParentFoo<T, T1>, IFoo where T1 : IBar { }