C# 铸造到集合<;界面>;

C# 铸造到集合<;界面>;,c#,.net,c#-4.0,collections,casting,C#,.net,C# 4.0,Collections,Casting,为此: public class Widget : IWidget {} 为什么这里的collection2==null: var collection1 = collectionView.SourceCollection as ObservableCollection<Widget>; var collection2 = collectionView.SourceCollection as ObservableCollection<IWidget>; var col

为此:

public class Widget : IWidget {}
为什么这里的
collection2==null

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

其中,
SourceCollection是observeablecollection

如果集合声明为
observeablecollection
,则不能将其强制转换为
observeablecollection
。我相信这在.NET4中是可能的,但不是3.5或更低版本-更正-请参阅下面亚当的评论

要使上述方法起作用,您必须将列表声明为
ObservableCollection
,然后两个强制转换都将起作用。在可能的情况下,您应该始终使用接口类型


当你使用“As”关键字时,这被称为安全施法。如果无法进行强制转换,它将返回null。显式转换。。。ie
(ObservableCollection)collectionView。如果无法进行强制转换,SourceCollection
将引发异常

SourceCollection和collection 1的类型是什么?在尝试强制转换之前,collectionView.SourceCollection的类型是什么?如果您使用的是.NET 4,请阅读以下内容:您使用的是哪个版本的C#?版本4.0通常支持通用协方差。您可以使用LINQ
Cast()
方法-但首先查看协方差。不,这在任何版本的.NET中都是不可能的。协方差和反方差仅在接口类型上可用(“ObservableCollection是一个具体类型”),并且仅在某些情况下可用。@AdamRobinson。。我不是100%确定。。。谢谢你的评论。已更新答案以适合:)