我正在尝试编写以下代码:
public const Size ImageSize = new Size() { Width = 28, Height = 28 };
但是我收到了“宽度”和“高度”是只读的错误。
有什么推荐的方法来解决这个问题吗?
const
关键字仅适用于编译器可以直接编写为中间语言的原始数据类型。如果 Size
被视为不可变量,那么使用 readonly
关键字就足够了。
public static readonly Size ImageSize = new Size(28,28);
Size
是一个可变的 struct
,那么可能会发生不好的事情;我建议使用属性而不是字段来防止许多令人困惑的副作用。根本的问题在于你无法将类型为System.Drawing.Size
的对象声明为const
。这表示该符号应在编译时用常量值替换。
相反,你应该使用readonly
。从某种意义上讲,这也是一个“常量”值,因为一旦构造函数运行,就不能修改对象,但是对象是在运行时创建而不是在编译时创建的。
以下代码可以正常编译:
public static readonly Size ImageSize = new Size() { Width = 28, Height = 28 };
public static readonly Size ImageSize = new Size(28,28);
public const Size ImageSize = new Size() { Width = 28, Height = 28 };
public const Size ImageSize = new Size();
ImageSize.Width = 28;
ImageSize.Height = 28;
你正在使用的版本被称为对象初始化程序,它只是上面那个版本的语法简写。两者在逻辑上是相同的。在后面的版本中,你可以看到为什么会出现错误,因为在声明之后就不能在一个const
上设置属性。
更重要的是,我不确定你是否可以将引用类型像这样用作const
。我不确定,因为我从未尝试过。你可以尝试使用readonly
。虽然你可能会遇到相同或类似的问题。
Size
是否有一个你可以使用参数调用的构造函数,而不是使用对象初始化程序呢?
Size
确实有一个以宽度和高度为参数的构造函数。这仍然无法解决您的根本问题,但了解这一点仍然很值得。 - Cody Graypublic readonly Size ImageSize = new Size(28, 28);
将实例设置为只读以防止其被更改,因为您无法将Size创建为常量。
来自文档:
常量表达式是一种可以在编译时完全评估的表达式。因此,引用类型的常量的唯一可能值是字符串和null。
你需要使用一个以宽度和高度为参数的构造函数。此外,表达式必须在编译时完全可计算。这可能无法与你的Size
类型(不知道是哪个)一起使用。如果是这样(例如System.Drawing.Size
),你可以考虑使用readonly
而不是const
。
你可以使用:
public static readonly Size ImageSize = new Size(28, 28);
它实际上不是const,但在初始化后不会被更改。
readonly
关键字会处理这个问题(你不能更改被标记为readonly
的struct
中的字段;编译器不允许你这样做)。至于Size
是否是可变结构体:这取决于我们正在谈论哪个Size
:OP 没有引用命名空间,并且在 BCL 中有 多个Size
类型,或者你当然可以定义自己的。 - Marc Gravell