1

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

4

2 回答 2

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# 中的警告非常少见,因此您几乎应该始终拥有无警告代码。

于 2013-04-29T09:55:53.757 回答
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));
    }
于 2013-04-29T09:55:59.963 回答