我试图在C#中的泛型类型参数中使用多态.我已经在SO(审查其他几个问题1,2,3,4,5,6),但我仍然不清楚为什么这不工作(或者如果它甚至允许的).
我有以下课程:
public class Base { }
public class Derived<T> : Base { }
public class Foo { }
Run Code Online (Sandbox Code Playgroud)
和我的派生泛型类型的实例:
var derived = new Derived<Foo>();
Run Code Online (Sandbox Code Playgroud)
以下陈述都是正确的:
derived is Object
derived is Base
derived is Derived<Foo>
Run Code Online (Sandbox Code Playgroud)
当我尝试将我的派生类用作另一个泛型类型中的类型参数时,我得到一些意外的行为.鉴于以下惰性实例:
var lazy = new Lazy<Derived<Foo>>();
Run Code Online (Sandbox Code Playgroud)
以下是真实的:
lazy is Lazy<Derived<Foo>>
Run Code Online (Sandbox Code Playgroud)
但是当我预期它们是真的时,这些都是错误的:
lazy is Lazy<Object>
lazy is Lazy<Base>
Run Code Online (Sandbox Code Playgroud)
为什么是这样?它们应该是真的还是我误解了仿制药是如何工作的?