Tag: covariance

当值类型可以相互转换时,为什么我不能将一个值类型的字典转换为另一个值类型的字典?

可能重复: 在C#中,为什么List 对象不能存储在List 变量中 以下为什么不工作? List castMe = new List(); IEnumerable getFromCast = (IEnumerable)castMe; // allowed. Dictionary<int, List> castMeDict = new Dictionary<int, List>(); Dictionary<int, IEnumerable> getFromDict = (Dictionary<int, IEnumerable>)castMeDict; // Not allowed 这是Dictionary铸造机制中的缺陷,还是我认为应该允许这样做? 谢谢。

为什么实现变体接口的类保持不变?

C#4.0进一步扩展了通用类型和接口的协方差和逆变。 一些接口(如IEnumerable )是协变量,所以我可以这样做: IEnumerable ie = new List(); 但是这条线怎么样? 我遇到了编译时错误 List list = new List(); //Cannot implicitly convert type List’ to List’ 我的意思是,如果List实现IEnumerable为什么List仍然是不变的? 有一个很好的反例可以解释为什么在C#中不允许这样做?

为什么C#(4.0)不允许generics类型中的共同和逆变?

这种限制的真正原因是什么? 这只是必须完成的工作吗? 概念上难吗? 这不可能吗? 当然,人们不能在字段中使用类型参数,因为它们总是可读写的。 但这不是答案,可以吗? 这个问题的原因是我在C#4上写了一篇关于方差支持的文章,我觉得我应该解释为什么它仅限于委托和接口。 只是为了逆转举证责任。 更新:埃里克问了一个例子。 怎么样(不知道这是否有意义,但是:-)) public class Lookup where T : Animal { public T Find(string name) { Animal a = _cache.FindAnimalByName(name); return a as T; } } var findReptiles = new Lookup(); Lookup findAnimals = findReptiles; 在一个类中拥有它的原因可能是类本身中保存的缓存。 请不要将您的不同类型的宠物命名为相同! 顺便说一下,这让我想到了C#5.0中的可选类型参数 🙂 更新2:我没有声称CLR和C#应该允许这个。 只是想了解是什么导致它没有。

将Generic 转换为Generic

我有一个基本WPF UserControl,它处理派生UserControls的一些常用function。 在任何派生的UserControl的代码隐藏中,我调用一个事件 private void SomeClick(object sender, RoutedEventArgs e) { HandleClick(sender); MyDataGrid.Items.Refresh(); } 在我的基础UserControl我做 public class BaseUserControl : UserControl { protected void HandleClick(object sender) { var vm = (BaseViewModel)DataContext; … } } 这会引发InvalidCastException,因为DataContext的类型为BaseViewModel但派生类型类似于BaseViewModel或BaseViewModel 。 我怎么能这样做?