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 はクラス定義に制約されます)

他のすべては正常に動作していますが、C を C に変換できないというメッセージが表示this.Addされます。それは C ( = true) を返し、それitem is Cをリストに追加しようとしますが、リストの制約がまさにその C にあるにもかかわらず、無効な引数をスローします。

使用しようとしても、割り当てられないというthis.AddRange理由で機能しません(mscorlib の差分バージョンに注意してください)。IEnumerable<T> v4.0.0.0IEnumerable<T> v2.0.5.0

古い 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を宣言していることに注意してください。これにより、次の呼び出しがなくても、次のような警告が表示されます。AddCAdd

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 に答える