当我有两个非通用Type对象a和b,我很容易验证是否是可分配的从b.通过使用所述a.IsAssignableFrom(b)功能.
class ClassBase { }
class ClassDerived : ClassBase { }
...
typeof(ClassBase).IsAssignableFrom(typeof(ClassDerived)) //returns true
Run Code Online (Sandbox Code Playgroud)
现在说我有两个通用接口:
interface IBase<T> { }
interface IDerived<T> : IBase<T> { }
Run Code Online (Sandbox Code Playgroud)
如果我关闭它们,我可以像以前一样做同样的行为,例如
typeof(IBase<object>).IsAssignableFrom(typeof(IDerived<object>)) //returns true
Run Code Online (Sandbox Code Playgroud)
事实上,任何T可用于关闭的东西IDerived也可用于关闭IBase并可IBase<T>从IDerived<T>(对于特定的T)分配.
然而,
typeof(IBase<>).IsAssignableFrom(typeof(IDerived<>)) //returns false
Run Code Online (Sandbox Code Playgroud)
我有点想知道为什么会这样(他们可以关闭不同的类型,从而得到不可逆转的?).据我所知,在这种情况下确实返回true的函数有些不同.问题是:"可以IBase<T>从IDerived<T>每个有效的分配T?" (感谢hvd)
我想做的是关闭泛型,然后询问它们是否可分配.但总的来说,我需要在最通用的类型下关闭b,这可能是a)丑陋,b)很难做到.
另一种方法是启动实现/继承树b并尝试将其与之比较a.
我的问题是,即使在一般情况下,是否有更简单的方法.
动机:一般兴趣,因为我最后并不需要这个.然而,当我使用Ninject和开放和封闭的泛型时,最初需要这个,我需要解决是否可以将开放的泛型类强制转换为开放的泛型接口(类).