1

スタックオーバーフロー例外が発生する理由を見つけようとしています。学校の課題用に単純なカード ゲームを作成しています。カードを複製して返すと、スタック オーバーフローの例外が発生します。

だから私はこのカードクラスを手に入れました:

public class Card : ICloneable
{
    ....

    #region ICloneable Members

    public object Clone()
    {
        return this.Clone(); // <--- here is the error thrown when the first card is to be cloned
    }

    #endregion
}

Handそして、カードを複製するというクラスがあります:

internal class Hand
{
        internal List<Card> GetCards()
        {
            return m_Cards.CloneList<Card>(); // m_Cards is a List with card objects
        }
}

最後に、次の拡張メソッドを取得しましたList

    public static List<T> CloneList<T>(this List<T> listToClone) where T : ICloneable
    {
        return listToClone.Select(item => (T)item.Clone()).ToList();
    }

エラーは、カード クラス (IClonable メソッド) でスローされます。

CardLibrary.dll で 'System.StackOverflowException' 型の未処理の例外が発生しました

4

2 に答える 2

22

あなたは自分自身を呼んでいます:

public object Clone()
{
    return this.Clone();
}

これにより、無限再帰が発生します。

Clone() メソッドは、すべてのプロパティ/フィールドを新しいオブジェクトにコピーする必要があります。

public object Clone()
{
    Card newCard = new Card();

    newCard.X = this.X;
    // ...

    return newCard;
}

または MemberwiseClone() を使用できます

public object Clone()
{
    return MemberwiseClone();
}

ただし、それではクローン作成プロセスを制御できなくなります。

于 2009-07-29T09:23:15.333 に答える
0

私は単純なデータに MemberwiseClone() を使用する傾向があり、次に複製する必要がある要素の階層全体に ICloneable を実装しました。

public class CRMLazyLoadPrefs : ICloneable
{
    public bool Core { get; set; }
    public bool Events { get; set; }    
    public bool SubCategories { get; set; }
    public OrganisationLazyLoadPrefs { get; set; }

    public object Clone()
    {
        CRMLazyLoadPrefs _prefs = new CRMLazyLoadPrefs();
        // firstly, shallow copy the booleans
        _prefs  = (CRMLazyLoadPrefs)this.MemberwiseClone();
        // then deep copy the other bits
        _prefs.Organisation = (OrganisationLazyLoadPrefs)this.Organisation.Clone();
    }
}

OrganizationLazyLoadPrefs は、階層全体で ICloneable なども実装します。

これが役に立てば幸いです、乾杯、テリー

于 2009-07-29T10:00:28.470 に答える