相关疑难解决方法(0)

C#方差问题:将List <Derived>分配为List <Base>

请看以下示例(部分取自MSDN博客):

class Animal { }
class Giraffe : Animal { }

static void Main(string[] args)
{
    // Array assignment works, but...
    Animal[] animals = new Giraffe[10]; 

    // implicit...
    List<Animal> animalsList = new List<Giraffe>();

    // ...and explicit casting fails
    List<Animal> animalsList2 = (List<Animal>) new List<Giraffe>();
}
Run Code Online (Sandbox Code Playgroud)

这是一个协方差问题吗?这将在未来的C#版本中得到支持吗?是否有任何聪明的解决方法(仅使用.NET 2.0)?

c# covariance

54
推荐指数
4
解决办法
2万
查看次数

泛型类型参数的多态性

我试图在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)

为什么是这样?它们应该是真的还是我误解了仿制药是如何工作的?

.net c# generics polymorphism

8
推荐指数
1
解决办法
591
查看次数

标签 统计

c# ×2

.net ×1

covariance ×1

generics ×1

polymorphism ×1