当我编译下面的代码时,编译器会给出错误:字段初始值设定项不能引用此代码中的非静态字段,方法或属性(有明星)
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);
}
}
答案 0 :(得分:4)
您应该将该行移动到构造函数中:
kingPiece = new KingPiece(siyahsah1,ChessColor.White);
问题是你还没有类实例,编译器也不喜欢它。如果您只是将该行移动到构造函数中,它就会起作用。
您仍然需要将该属性定义为私有字段。你可以这样做:
private KingPiece kingPiece;
在第一行的当前位置执行此操作。最终结果将与您现在的结果完全相同,只是它会编译。
答案 1 :(得分:2)
错误是自我解释。 siyahsah1是KingPiece的非静态私有属性,并且在调用构造函数时不会初始化。
答案 2 :(得分: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) {
...
}
}
希望这有帮助。