我有2个共享基类的类
DealBookmarkWrapper : BookmarkWrapper
StoreBookmarkWrapper : BookmarkWrapper
Run Code Online (Sandbox Code Playgroud)
我还有以下声明:
// 1 - This works
List<BookmarkWrapper> bm = new List<BookmarkWrapper>();
foreach(var d in deals)
{
bm.Add(new DealBookmarkWrapper(d));
}
// 2 - This does not work
List<BookmarkWrapper> bm2 = deals.Select(d => new DealBookmarkWrapper(d)).ToList();
Run Code Online (Sandbox Code Playgroud)
1)工作,但2需要演员工作.我不确定我是做错了什么,还是在第二种场景中确实需要演员.
有人对它有所了解吗?
你的问题是双重的:
T
的ToList<T>
是由编译器推断为DealBookmarkWrapper
,所以List<DealBookmarkWrapper
>被产生.List<T>
不是协变类型,因此从List<DealBookmarkWrapper
>到没有表示保留转换List<BookmarkWrapper>
.有关为何如此的详细信息,请参阅此问题.您已经发现在Select
投影中添加强制转换是一种解决方法.另一种方式,在C#4 + .NET 4.0(或更高版本)中将明确指定type-argument并依赖于协方差IEnumerable<T>
:
deals.Select(d => new DealBookmarkWrapper(d))
.ToList<BookmarkWrapper>()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
299 次 |
最近记录: |