Tag: 逆转

Covariance / Contravariance不应该在C#4.5中允许这样吗?

private Dictionary<Type, List> dataStore = new Dictionary<Type, List>(); public void Insert(T dto) where T : IDataTransferObject { if (!dataStore.ContainsKey(typeof(T))) { dataStore.Add(typeof(T), new List()); } dataStore[typeof(T)].Add(dto); } 上面的代码给出了dataStore.Add行的编译错误,因为它不喜欢我尝试将List分配给List 。 由于我的方法将T限制为只有IDataTransferObject,因此.Net 4中的协方差/反函数不应该允许这个代码吗? 我知道我可以改变它来做新的List它会工作,但我很好奇为什么原始代码不起作用。

协方差和反演 – 只是调用保证基类行为的不同机制?

我正在努力理解这两个概念。 但我想在经过许多video和SO QA之后,我将其简化为最简单的forms: 协变 – 假设一个子类型可以做它的基类型。 逆变 – 假设您可以像对待基类型一样处理子类型。 假设这三个类: class Animal { void Live(Animal animal) { //born! } void Die(Animal animal) { //dead! } } class Cat : Animal { } class Dog : Animal { } 协变 任何动物都可以做动物做的事。 假设子类型可以执行其基类型的操作。 Animal anAnimal = new Cat(); anAnimal.Live(); anAnimal.Die(); Animal anotherAnimal = new Dog(); anotherAnimal.Live(); anotherAnimal.Die(); […]

与C#数组的协方差和逆差

在阅读维基百科关于协方差和逆变的文章的一部分时,我遇到了以下粗体句: 首先考虑数组类型构造函数:从类型Animal我们可以创建类型Animal[] (“动物数组”)。 我们应该把它视为 协变: Cat[]是Animal[] 逆变: Animal[]是Cat[] 或两者(不变)? 如果我们希望避免类型错误,并且数组支持读取和写入元素,那么只有第三种选择是安全的。 显然,并非每个Animal[]都可以被视为Cat[] ,因为从数组中读取的客户端将期望Cat,但Animal[]可能包含例如Dog 。 所以逆变规则并不安全。 相反, Cat[]不能被视为Animal[] 。 应该总是可以将Dog放入Animal[] 。 对于协变数组,这不能保证是安全的,因为后备存储实际上可能是一组猫。 所以协变规则也不安全 – 数组构造函数应该是不变的。 请注意,这只是可变数组的一个问题; 协变规则对于不可变(只读)数组是安全的。 我理解这个概念; 我只是想要一个如何在C#中“无法保证安全”的例子 。

如何创建包含一组只有自己的类型或子类型为子类的generics类?

abstract class Animal { } class Mammal : Animal { } class Dog : Mammal { } class Reptile : Animal { } class AnimalWrapper where T : Animal { public ISet<AnimalWrapper> Children { get; set; } } class Program { public static void Main(string[] args) { var foo = new AnimalWrapper(); foo.Children = new […]

为什么协方差不适用于generics方法

假设我有接口和类: public interface ITree {} public class Tree : ITree {} 由于IEnumerable是协变的 ,下面的代码行被成功编译: IEnumerable trees = new List(); 但是当我把它放入通用方法时: public void Do() where T : ITree { IEnumerable trees = new List(); } 我从编译器得到编译错误: 错误1无法将类型’System.Collections.Generic.List’隐式转换为’System.Collections.Generic.IEnumerable’。 存在显式转换(您是否缺少演员?)D:\ lab \ Lab.General \ Lab.General \ Program.cs 83 40 Lab.General 为什么协方差在这种情况下不起作用?

理解C#4.0中的协方差和逆变

我在第9频道观看了一段关于它的video,但我对此并不是很了解。 有人可以给我一个关于这些容易理解的简单例子吗? 之后可能会如何在实践中使用它?

Casting List – 协方差/逆变问题

给出以下类型: public interface IMyClass { } public class MyClass : IMyClass { } 我想知道如何将List转换为List ? 关于协方差/逆变主题,我并不完全清楚,但据我所知,由于这个原因,我不能仅仅清楚地列出清单。 我只能提出这个微不足道的解决方案; 缺乏优雅,浪费资源: … public List ConvertItems(List input) { var result = new List(input.Count); foreach (var item in input) { result.Add(item); } return result; } …. 你怎么能以更优雅/高效的方式解决它? ( 请注意,我需要.NET 2.0解决方案,但为了完整性,我也很高兴看到使用更新框架版本的更优雅的解决方案。 )