这是一个语法问题。我有一个泛型类,它继承自泛型基类,并将约束应用于其中一个类型参数。我还希望派生类实现一个接口。对于我的生活,我似乎无法弄清楚正确的语法。
这就是我所拥有的:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }
首先想到的是:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }
但这是不正确的,因为这导致T2需要实现IBar和IFoo,而不是DerivedFoo来实现IFoo。
我尝试了一些谷歌搜索,使用冒号,分号等,但我已经做空了。我确定答案很简单。
答案 0 :(得分:137)
在定义通用约束之前,请包含类的完整签名。
class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar
{
...
}
答案 1 :(得分:16)
我的建议:当您对C#语言的语法有疑问时,请阅读规范;这就是我们发布它的原因。您需要阅读第10.1节。
要回答您的具体问题,班级声明中的事物顺序为:
该列表中的所有内容都是可选的,但“class”,名称和正文除外,但如果出现,则所有内容都必须按顺序显示。
答案 2 :(得分:6)
public interface IFoo {}
public interface IBar {}
public class ParentFoo<T,T1> { }
public class DerivedFoo<T, T1> : ParentFoo<T, T1>, IFoo where T1 : IBar { }
答案 3 :(得分:2)
public class KeyAndValue<T>
{
public string Key { get; set; }
public virtual T Value { get; set; }
}
public class KeyAndValue : KeyAndValue<string>
{
public override string Value { get; set; }
}
这是现有答案的扩展。如果您不提供类型,则默认为string
。我没有实现接口,但是不需要任何不同于平常的东西。