【发布时间】:2010-10-09 17:13:55
【问题描述】:
我有一个例程
public void SomeRoutine(List<IFormattable> list) { ... }
然后我尝试调用这个例程
List<Guid>list = new List<Guid>();
list.Add(Guid.NewGuid());
SomeRoutine(list);
它会因编译时错误而失败。 System.Guid 实现 IFormattable,但我得到的错误是
无法从 'System.Collections.Generic.List' 到 'System.Collections.Generic.List'
注意:如果您只使用一组 Guid,您将得到同样的错误。泛型不是原因....
但是!鉴于此
public void SomeRoutine2(IFormattable obj) { ... }
还有这个
Guid a = Guid.NewGuid();
SomeRoutine2(a);
它编译!所以问题是为什么?为什么我能够将 Guid 对象(实现 IFormattable)传递到接受 IFormattable 对象的例程中,但是当我尝试将其扩展为集合(通用列表、数组或其他任何东西)时,我得到转换错误?
我花了很长时间寻找答案,我认为这将是最好的去处。
【问题讨论】:
-
您确实意识到标记的答案(.NET 4.0 协方差)实际上并不适用于列表,因为泛型现在可以工作?
-
除非它不适用于带有查找 IFormattable 数组的例程的 Guid 数组......?
标签: c# .net generics interface clr