0

コードから始めます

class LocData 
{
    public virtual TypeA Copy () { ... }
    ...
}

class LocDataCollection<T> : List<T> where T: LocData
{
    public LocDataCollection<T> Copy() 
    {
        LocDataCollection<T> locDatas = new LocDataCollection<T>();
        foreach (T locData in this)
        {
            T locData2 = locData.Copy() as T;
            locDatas.Add(locData2);
        }
        return locDatas;
    }
  ...
}

class TypeA : LocData
{
  public new TypeA Copy () { ... }
  ...
}

class TypeACollection : LocDataCollection<TypeA>
{
}

テストコード:

TypeACollection typeAs = new TypeACollection();
...
TypeACollection typeAs2 = typeAs.Copy();

メッセージをコンパイルします。

「型'LocDataCollection'を'TypeACollection'に暗黙的に変換することはできません。明示的な変換が存在します(キャストがありませんか?)」

私はに変更する必要があります

TypeACollection typeAs2 = typeAs.Copy() as TypeACollection;

コンパイルパスですが、実行時にエラーが発生します。typeAsがnullでなくても、typeAs2はnullとして返されます。

4

1 に答える 1

4

typeAs.Copy()を返しますLocDataCollection<TypeA>。ただし、はより派生しているTypeACollectionため、これらの1つをに割り当てることはできません。TypeACollectionLocDataCollection<TypeA>

LocDataCollection<T>コピーメソッドに:を受信させることで、問題を解決できる可能性があります。

class LocDataCollection<T> : List<T> where T: LocData
{
    public void CopyTo(LocDataCollection<T> dest) 
    {
        ....
    }
}

次に、コールサイトで:

TypeACollection typeAs = new TypeACollection();
TypeACollection typeAs2 = new TypeACollection();
typeAs.CopyTo(typeAs2);

もちろん、TypeACollectionその効果にオーバーライドを追加しない限り、これは特定のものをコピーしません。

しかし、私はあなたの問題について、これが適切な解決策であると確信するのに十分なことを本当に知りません。

于 2012-04-20T20:23:08.403 に答える