对于不同的mscorlib版本,无法将IEnumerable <t>转换为IEnumerable <t> </t> </t>

时间:2013-04-29 09:50:00

标签: c# .net ienumerable

我正在搞乱一些通用类,其中我有一个集合类,其中包含一个从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的内容?其他人有这个问题吗?

2 个答案:

答案 0 :(得分:4)

怀疑问题是这样的:

class MyCollection<C>
{
    private List<C> list = new List<C>();

    public void Add<C>(C item)
    {
        list.Add(item);
    }
}

请注意,MyCollectionAdd都声明了一个名为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方法

中再次限制了C.

更改为此修复了它:

   public void LoadCollection<D>(IEnumerable<D> dtos, Func<D, C> fetch)
        where D : class
    {
        foreach (var dto in dtos)
            this.Add(fetch(dto));
    }