为什么一个泛型 class 实现一个带有类型约束的泛型接口需要重复这些约束?

Why does a generic class implementing a generic interface with type constraints need to repeat these constraints?

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

类型约束也是来自界面的 "inherited"(我知道这不是正确的词)是否有意义?

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

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

关键是 InterfaceImpl<T> 中的 T 属于 InterfaceImpl,所以任何对 T 的约束都必须是 InterfaceImpl 的拥有。