【问题标题】:Casting to Collection<interface>强制转换为集合<interface>
【发布时间】:2011-09-27 12:28:53
【问题描述】:

有了这个:

public class Widget : IWidget {}

为什么collection2 == null在这里:

var collection1 = collectionView.SourceCollection as ObservableCollection<Widget>;
var collection2 = collectionView.SourceCollection as ObservableCollection<IWidget>;

在哪里SourceCollection is ObservableCollection&lt;Widget&gt;

【问题讨论】:

  • SourceCollection 的类型是什么
  • 集合 1 不是吗?在您尝试投射之前,collectionView.SourceCollection 的类型是什么?
  • 如果您使用的是 .NET 4,请阅读:Covariance and Contravariance in Generics
  • 您使用的是哪个版本的 C#? 4.0 版通常支持泛型协方差。
  • 您可以使用 LINQ Cast() 方法 - 但首先查看协方差。

标签: c# .net c#-4.0 collections casting


【解决方案1】:

如果集合被声明为ObservableCollection&lt;Widget&gt;,则它不能转换为ObservableCollection&lt;IWidget&gt;。 我相信这在 .NET 4 中是可能的,但在 3.5 或更低版本中是可能的 - 更正 - 请参阅下面 Adam 的评论。

要使上述方法起作用,您必须将列表声明为ObservableCollection&lt;IWidget&gt;,然后两种转换都将起作用。无论如何,您应该始终使用接口类型。

顺便说一句,当您使用“as”关键字时,这称为安全强制转换。如果无法进行强制转换,它将返回 null。显式转换 ... 即 (ObservableCollection&lt;IWidget&gt;) collectionView.SourceCollection 如果无法进行转换,将抛出异常。

【讨论】:

  • 不,这在任何版本的 .NET 中都是不可能的。协变和逆变仅在接口类型(`ObservableCollection 是一种具体类型)上可用,并且仅在某些情况下可用。
  • @AdamRobinson .. 我不是 100% 确定...感谢您的评论。已经更新了适合的答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2019-03-12
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多