【问题标题】:Why does a generic class implementing a generic interface with type constraints need to repeat these constraints?为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?
【发布时间】:2015-04-05 17:57:30
【问题描述】:

假设我有以下 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
    }
}

类型约束也从接口“继承”(不是正确的词,我知道)不是有意义吗?

【问题讨论】:

  • 如果没有指定,它们可能已经“默认”实现。但实际语法允许重新定义约束(继承、new() 关键字等),这很好。

标签: c# .net generics inheritance interface


【解决方案1】:

类不需要重复这些约束,它需要提供一个满足接口约束的类型。有几种方法:

  • 它可以提供满足约束的特定类型,或者
  • 它可以对泛型类型设置自己的约束,这些约束比接口预期的要强,或者
  • 它可以从界面重复约束。

关键是InterfaceImpl&lt;T&gt;中的T属于InterfaceImpl,所以对T施加的任何约束都必须是InterfaceImpl自己的。

【讨论】:

  • 非常漂亮和清晰的解释,最后一句话对我来说至关重要:) 知道你的答案,我唯一不明白的是为什么 C# 会允许我创建一个不做的类您的回答中提到的任何事情?比如说,它是一些不调用 T 方法的抽象类——我可以编译它而不对 T 施加任何约束或指定类型,这将满足接口的约束。
  • @BartekEborn 我不确定你的意思。在泛型接口有约束的情况下,实现它的类需要提供兼容的参数,无论实现类是否是抽象的 (demo - does not compile)。我确定你的意思是别的。你能做一个演示来说明你的意思吗?您可以在我的演示中单击“fork”,如果您愿意,可以对其进行修改。
  • 这正是我的意思。我的错,我为你的努力感到抱歉。我信任 Intellisense,它在这种情况下并没有突出显示错误(尽管它在前面做了)。实际测试后,我感到很惭愧:(再次抱歉!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
相关资源
最近更新 更多