为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?
比方说,我有一个如下的C#接口:为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?
public interface IInterface<T> where T : SomeClass
{
void InterfaceMethod();
}
,并按如下SomeClass的定义:
public class SomeClass
{
public void SomeMethod();
}
现在,我想定义接口的实现,这将不编译:
public class InterfaceImpl<T> : IInterface<T>
{
public void InterfaceMethod()
{
T test = default(T);
test.SomeMethod(); //Gives Error
}
}
之前,我将其更改为:
public class InterfaceImpl<T> : IInterface<T> where T : SomeClass
{
public void InterfaceMethod()
{
T test = default(T);
test.SomeMethod(); //Compiles fine
}
}
从界面中类型约束是否也是“继承的”(不是我所知道的正确的词)是不合理的?
该类不需要重复这些约束,它需要提供一种类型,即满足接口的约束条件。有这样做的几种方法:
- 它可以提供满足约束条件的特定类型或
- 它可以放置在一个通用的类型比接口所期待的强其自身的限制,或
- 它可以从接口重复约束。
关键的一点是,在T
InterfaceImpl<T>
属于InterfaceImpl
,以便放置在任何T
约束必须是InterfaceImpl
自己。
非常好的和明确的解释,最后一句对我来说至关重要:)知道你的答案,我唯一不明白的是为什么C#允许我创建一个不会执行你提到的任何事情的类回答?比如说,它是一些抽象类,它不调用T的方法 - 我可以在不对T进行任何约束或指定类型的情况下编译它,这将满足接口的约束。 – 2015-02-05 18:47:46
@BartekEborn我不确定你的意思。在通用接口有约束的情况下,实现它的类需要提供一个兼容的参数,而不管实现类是否抽象([demo-not-compile](http://ideone.com/WG9pR1) )。我相信你的意思是别的。你能做一个演示来展示你的意思吗?你可以点击演示中的“fork”,然后根据需要进行修改。 – dasblinkenlight 2015-02-05 18:57:35
这正是我的意思。我不好,我为你的努力感到抱歉。我信任Intellisense,在这种情况下没有突出显示错误(尽管它在前面已经提到过)。经过实际测试,我感到羞愧:(再次抱歉! – 2015-02-05 19:04:36
如果没有指定,他们可能已经“默认”实现了。但实际的语法允许重新定义约束(继承,new()关键字等),这很好。 – AFract 2015-02-05 18:32:10