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