Tag: 协方差

协方差和上传之间的区别

协变和上传之间有什么区别,或者更具体地说,为什么他们有不同的名字? 我已经看到下面的例子被称为“上传”: string s = "hello"; object o = s; //upcast to 'string' to 'object' 鉴于以下我所见到的“协变”: string[] s = new string[100]; object[] o = s; IEnumerable<string> ies = new List<string>(); IEnumerable<object> ieo = ies; 现在,对我未经训练的人来说,协变似乎与上演一样,只不过它指的是collections的铸造。 (关于逆转和下转也可以做出类似的说法)。 这真的很简单吗?

从x到y的共变数组转换可能导致运行时exception

我有一个private readonly列表( IList<LinkLabel> )。 我后来将LinkLabel添加到此列表中,并将这些标签添加到FlowLayoutPanel ,如下所示: foreach(var s in strings) { _list.Add(new LinkLabel{Text=s}); } flPanel.Controls.AddRange(_list.ToArray()); Resharper给我一个警告: Co-variant array conversion from LinkLabel[] to Control[] can cause run-time exception on write operation 。 请帮我弄清楚: 这是什么意思? 这是一个用户控件,不会被多个对象访问来设置标签,所以保持代码不会影响它。

为什么不能将IEnumerable <struct>转换为IEnumerable <object>?

为什么最后一行不允许? IEnumerable<double> doubleenumerable = new List<double> { 1, 2 }; IEnumerable<string> stringenumerable = new List<string> { "a", "b" }; IEnumerable<object> objects1 = stringenumerable; // OK IEnumerable<object> objects2 = doubleenumerable; // Not allowed 这是因为double是不是从对象派生的值types,因此协变不起作用? 这是否意味着没有办法做到这一点: public interface IMyInterface<out T> { string Method(); } public class MyClass<U> : IMyInterface<U> { public string Method() { return "test"; } […]

C#:方差(协方差/反variables)是多态吗?

我想从网上的几篇文章和StackOverflow上的问题中Contravariance Covariance和“ Contravariance ”一词的确切含义,从我能理解的情况来看,这只是多态的另一个词 。 我是否正确的以上陈述? 还是我错了?

关于C#协方差的问题

在下面的代码中: interface I1 { } class CI1: I1 { } List<CI1> listOfCI1 = new List<CI1>(); IEnumerable<I1> enumerableOfI1 = listOfCI1; //this works IList<I1> listofI1 = listOfCI1; //this does not 我能够将我的“listOfCI1”分配给IEnumerable<I1> (由于协方差) 但为什么我不能把它分配给IList<I1> ? 对此,我甚至不能做到以下几点: List<I1> listOfI12 = listOfCI1; 不应该使用协方差来将派生types分配给基types?

任何简单的方法来解释为什么我不能做的List <Animal> animals = new ArrayList <Dog>()?

我知道为什么不应该这样做。 但有没有办法向外行解释为什么这是不可能的。 你可以很容易地向外行解释: Animal animal = new Dog(); 。 狗是一种动物,但是狗的名单不是动物的名单。

协变在C#

是否有可能在C#4.0中将List<Subclass> List<Superclass>为List<Superclass> ? 沿着这些线路的东西: class joe : human {} List<joe> joes = GetJoes(); List<human> humanJoes = joes; 这不是协变的原因吗? 如果你能做到: human h = joe1 as human; 你为什么不能做呢 List<human> humans = joes as List<human>; 比(joe)人类[0]是不合法的,因为这个项目已经被拒绝了,每个人都会很高兴。 现在唯一的select是创build一个新的列表

generics中的<out T> vs <T>

<out T>和<T>什么区别? 例如: public interface IExample<out T> { … } 与 public interface IExample<T> { … } 我从MSDN得到的唯一信息是 您可以在generics接口和委托中使用out关键字。

什么是协变返回types?

什么是Java中的协变返回types? 在一般的面向对象编程中?

.NET 4中的IDictionary <TKey,TValue>不是协变的

.NET 4 / Silverlight 4中的IDictionary<TKey, TValue>不支持协方差,即我不能做 IDictionary<string, object> myDict = new Dictionary<string, string>(); 类似于我现在可以用IEnumerable<T>做什么。 大概归结为KeyValuePair<TKey, TValue>也不是协变的。 我觉得在词典中至less应该允许协variables的值。 那么这是一个错误还是一个function? 它会不会来,也许在.NET 37.4? 更新(2年后): 在.NET 4.5中将会有一个IReadOnlyDictionary<TKey, TValue> ,但它不会是协变的:·/因为它是从IEnumerable<KeyValuePair<TKey, TValue>>和KeyValuePair<TKey, TValue>派生的一个接口,因此不能协变。 BCL团队将不得不重新devise很多来使用一些ICovariantPair<TKey, TValue>来代替。 对于协变接口来说, this[TKey key]强types索引器也是不可能的。 类似的结局只能通过放置一个扩展方法GetValue<>(this IReadOnlyDictionary<TKey, TValue> self, TKey key)来实现,这个方法在某种程度上必须在内部调用一个实际的实现,这看起来像一个相当混乱的方法。