为什么一个泛型 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
的拥有。
假设我有以下 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
的拥有。