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 是一个非静态私有字段,不能用于初始化其他字段。但是这里还有另一个问题。因为KingPiece该类只有一个构造函数,所以您不能在构造函数本身中创建该类的新实例 - 它会生成一个StackOverflowException. 解决方法是创建另一个只能从KingPiece类中调用的私有构造函数。但更好的是,也许您可​​以确切地告诉我们您想做什么,我们可以帮助您。

更新:考虑到评论,我猜 arash 想要指定要与KingPiece类一起使用的图像。如果只使用一个独立于作品颜色的图像,那么您可以将该参数传递给基本构造函数。

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 回答