0

以下のコードをコンパイルすると、コンパイラーはエラーを出します:フィールド初期化子は、このコード(星が付いている)の非静的フィールド、メソッド、またはプロパティを参照できません

 KingPiece kingPiece = new KingPiece(***siyahsah1***,ChessColor.White);

誰かが私を助けることができますか?

 class PiecePosition
{

    public enum ChessColor
    {
        White,
        Black,
    }
    public class ChessPiece
    {

        private Image DisplayedImage;
        private ChessColor DisplayedColor;
        private Point CurrentSquare;
        public Point[] ValidMoves;
        public ChessPiece(Image image, ChessColor color)
        {
            DisplayedImage = image;
            DisplayedColor = color;
        }
    }

    public  class KingPiece : ChessPiece
    {



        public KingPiece(Image image, ChessColor color)
            : base(image, color)
        {


            ValidMoves[0] = new Point(0, -1);    //  Up 1
            ValidMoves[1] = new Point(1, -1);  //  Up 1, Right 1
            ValidMoves[2] = new Point(1, 0);     //  Right 1

            ValidMoves[7] = new Point(-1, -1);  //  Left 1, Up 1
        }

        System.Drawing.Bitmap siyahsah1 = chess6.Properties.Resources.siyahsah1;
        KingPiece kingPiece = new KingPiece(siyahsah1,ChessColor.White);


    }

}
4

3 に答える 3

4

行をコンストラクターに移動する必要があります。

kingPiece = new KingPiece(siyahsah1,ChessColor.White);

問題は、クラスインスタンスがまだなく、コンパイラがそれを好まないことです。行をコンストラクターに移動するだけで機能します。

プロパティをプライベートフィールドとして定義する必要があります。これは次の方法で実行できます。

private KingPiece kingPiece;

これは、最初の行の現在の場所で行います。最終結果は、コンパイルされることを除いて、現在の結果とまったく同じになります。

于 2010-11-06T16:46:02.923 に答える
2

エラーは自明です。siyahsah1はKingPieceの非静的プライベートプロパティであり、コンストラクターが呼び出された時点では初期化されていません。

于 2010-11-06T16:41:31.737 に答える
1

他の人が言っているように、siyahsah1は非静的なプライベートフィールドであり、他のフィールドを初期化するために使用することはできません。しかし、ここには別の問題があります。クラスにはコンストラクターが1つしかないためKingPiece、コンストラクター自体にそのクラスの新しいインスタンスを作成することはできません。これにより、が生成されStackOverflowExceptionます。KingPiece回避策は、クラス内からのみ呼び出すことができる別のプライベートコンストラクターを作成することです。しかし、さらに良いことに、あなたがやりたいことを正確に教えていただければ、私たちはそれをお手伝いできます。

更新:コメントを考慮すると、arashはKingPieceクラスで使用する画像を指定したいと思っていると思います。ピースの色に関係なく1つの画像のみが使用される場合は、その引数をベースコンストラクターに渡すことができます。

public class KingPiece: ChessPiece {
  public KingPiece(ChessColor color):
    // Pass the image to the base class. All king pieces will use this image.
    base(chess6.Properties.Resources.siyahsah1, color) {
    ..
  }
}

ただし、色ごとに異なる画像が必要な場合は、他の場所で定義するか、静的フィールド/プロパティとして定義する必要があります。

public class KingPiece: ChessPiece {
  public static readonly BlackKing = new KingPiece(/* image of the black king here */, ChessColor.Black);
  public static readonly WhiteKing = new KingPiece(/* image of the white king here */, ChessColor.White);

  // Constructor could also be made private since you probably don't need other instances beside black and white.
  public KingPiece(Image image, ChessColor color): base(image, color) {
    ...
  }
}

お役に立てれば。

于 2010-11-06T16:59:02.673 に答える