我正在搞乱一些通用类,其中我有一个集合类,其中包含一个从DTO集合加载对象的方法,使用Func
public void LoadCollection<C, D>(IEnumerable<D> dtos, Func<D, C> fetch)
where D : class
{
foreach (var dto in dtos)
this.Add(fetch(dto)); // Can't assign a C to a C??
}
(C受限于def类)
其他一切工作正常 - 但我得到的消息是我无法将C转换为C.如果我删除this.Add
并进行调试,请在获取后检查类型;它返回一个C(item is C
= true),尝试将其添加到列表中然后抛出无效的参数,即使列表上的约束在那个C上。
尝试使用this.AddRange
也不起作用引用IEnumerable<T> v4.0.0.0
无法分配给IEnumerable<T> v2.0.5.0
(请注意mscorlib的差异版本)
有没有一种简单的方法可以找出引用旧版mscorlib的内容?其他人有这个问题吗?
答案 0 :(得分:4)
我怀疑问题是这样的:
class MyCollection<C>
{
private List<C> list = new List<C>();
public void Add<C>(C item)
{
list.Add(item);
}
}
请注意,MyCollection
和Add
都声明了一个名为C
的类型参数。即使没有调用Add
:
Test.cs(8,21): warning CS0693: Type parameter 'C' has the same name as the type
parameter from outer type 'MyCollection<C>'
Test.cs(4,20): (Location of symbol related to previous warning)
Add
电话会出现以下错误:
Test.cs(10,9): error CS1502: The best overloaded method match for
'System.Collections.Generic.List<C>.Add(C)' has some invalid arguments
Test.cs(10,18): error CS1503: Argument 1: cannot convert from 'C
[c:\Users\Jon\Test\Test.cs(4)]' to 'C'
Test.cs(8,21): (Location of symbol related to previous error)
这与mscorlib差异无关,这可能是也可能不是问题。
道德:注意编译时警告!他们可以为您提供其他错误的线索。 C#中的警告非常罕见,您几乎总是没有警告代码。
答案 1 :(得分:1)
发布后5秒始终回答我自己的问题:(
意识到我在LoadCollection
方法
更改为此修复了它:
public void LoadCollection<D>(IEnumerable<D> dtos, Func<D, C> fetch)
where D : class
{
foreach (var dto in dtos)
this.Add(fetch(dto));
}