错误CS0133:将函数的结果赋值给C#.net中的const

Gre*_*jan 1 c# syntax pinvoke

尝试整理范围并避免可能多次调用RegisterWindowMessage.
目前有一个类使用以下成员一次

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int RegisterWindowMessage(string lpString);

private int m_message = RegisterWindowMessage("MY_MSG"); 
Run Code Online (Sandbox Code Playgroud)

由于我们只有一个实例,这似乎没问题,但认为使用它会更整洁.根据我的基本C#理解,这应该调用RegisterWindowMessage并将结果分配给int并且不允许它更改.

private const int message = RegisterWindowMessage("MY_MSG"); 
Run Code Online (Sandbox Code Playgroud)

但试图这样做会导致a

error CS0133: The expression being assigned to 'someclass.messageEvent' must be constant
Run Code Online (Sandbox Code Playgroud)

所以现在我很困惑,这是否意味着函数被分配并且每次调用之前都m_message被调用过,是否还有其他缺失?

Jon*_*eet 7

const字段必须是一个编译时间常数.如果您只想要在初始分配1后的执行时间不会改变的内容,请将其设为只读:

private static readonly int Message = RegisterWindowMessage("MY_MSG");
Run Code Online (Sandbox Code Playgroud)

请注意,我已经使这个静态,这const是隐含的.这意味着RegisterWindowMessage只会为此AppDomain调用一次,这是我认为你想要的.

编辑:汉斯是对的,你应该检查返回值.您可以在第一次使用它时或者在初始化类型时执行此操作 - 通常,类型初始化程序抛出异常是个坏主意,但您应该看到影响是什么.


1严格地说,可以在声明或静态构造函数中指定静态只读字段; 可以在声明或任何实例构造函数中分配实例只读字段.它可以多次分配,这通常没用,但偶尔也可以.