为何必须在后代类型上重新声明泛型类型限制?

在C#中,给出如下通用类型:

interface IGenericType<T> where T : new()

和后代类型,例如:

class GenericTypeImplementation<U> : IGenericType<U>

为什么我们需要用父类型的所有限制来显式地限制通用类型U?

class GenericTypeImplementation<U> : IGenericType<U> where U : new()

我是否可以推断出问题出在编译器计算限制的并合中?

interface IGenericType<T> where T : new()
interface IGenericType2<T> where T : SomeOtherType
class GenericTypeImplementation<U> : IGenericType<U>, IGenericType2<U>
/* Hypothesis: Compiler can't infer U must be "SomeOtherType + new()" */

解决方法:

我认为,编译器可能足够聪明,可以从理论上推断出这些限制.但是它不应该那么聪明,因为过于智能的编译器有时会很危险.开发人员始终需要对所有内容进行清晰/明确的定义.看到这种情况:

(1)存在接口IFoo< T>.其中T:new()

(2)Foo T类. :IFoo< T>并且new()约束由编译器自动添加(非常棒!)

(3)类Foo T在整个项目中是非常基础的类,类A T :Foo< T&gt ;,然后类别B< T> :A< T> …

(4)现在,另一位开发人员通过查看类的定义几乎无法意识到存在这样的约束,他会得到奇怪的编译错误(这是可以接受的).但是,如果它们是通过反射调用的呢?有时程序是正确的,因为数据偶然符合限制.

上一篇:【JAVA系列】Java8、Java7、Java5新特性


下一篇:php-用户代理标头-mysql存储的缩写