我正在尝试编写以下代码:
public const Size ImageSize = new Size() { Width = 28, Height = 28 };
但是我收到Width
和Height
是只读的错误。
建议的方法是什么?
答案 0 :(得分:10)
根本问题是您无法将System.Drawing.Size
类型的对象声明为const
。这表明该符号将在编译时被替换为常量的值。
相反,您应该使用readonly
。这也是一个“常量”值,因为一旦构造函数运行就无法修改它,但是这些对象是在运行时而不是编译时创建的。
以下代码编译得很好:
public static readonly Size ImageSize = new Size() { Width = 28, Height = 28 };
答案 1 :(得分:8)
const
仅限于编译器可以直接写为IL的原语。 readonly
应该足够如果 Size
被视为不可变的,即
public static readonly Size ImageSize = new Size(28,28);
请注意,如果Size
是可变struct
,则可能会发生错误;我建议使用属性而不是字段来防止一些令人困惑的副作用。
答案 2 :(得分:2)
public static readonly Size ImageSize = new Size(28,28);
答案 3 :(得分:1)
你必须这样做:
public readonly Size ImageSize = new Size(28, 28);
使实例只读以防止它被更改,因为您无法将Size创建为常量。
来自文档:
常量表达式是一个可以在编译时完全计算的表达式。因此,引用类型常量的唯一可能值是string和null。
答案 4 :(得分:1)
您正在编写的代码:
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
是否有可以使用参数调用的构造函数,而不是使用对象初始值设定项?
答案 5 :(得分:0)
您需要使用以width和height为参数的构造函数。
此外,表达式必须在编译期间完全可评估。这可能不适用于您的Size
类型(不知道它是哪一种)。如果是这样(与System.Drawing.Size
一样),您可以考虑使用readonly
代替const
。
答案 6 :(得分:0)
您可以使用:
public static readonly Size ImageSize = new Size(28, 28);
它实际上不是const,但在初始化后不会改变。