如何定义公共静态只读字段?

Mic*_*its 5 .net f#

在 C# 中,可以像这样定义一个公共静态只读字段:

namespace MyNamespace
{
    public static class MyClass
    {
        public static readonly string MyValue = "Test";
    }
}
Run Code Online (Sandbox Code Playgroud)

在 F# 中,我能想到的最符合上述定义的代码是:

namespace MyNamespace

module MyClass =
    [<Literal>]
    let MyValue = "Test"
Run Code Online (Sandbox Code Playgroud)

但这实际上转化为以下 C# 片段:

namespace MyNamespace
{
    public static class MyClass
    {
        public const string MyValue = "Test";
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在 F# 中定义公共静态只读字段?const对我来说不是一个选择,因为我想使用不同的程序集

scr*_*wtp 3

只需删除该Literal属性并使用 let-bound 值即可:

module MyClass =
    let MyValue = "Test"
Run Code Online (Sandbox Code Playgroud)

这将编译为静态仅 getter 属性的等效项(ILSpy 生成的 C#):

public static string MyValue
{
    [DebuggerNonUserCode, CompilerGenerated]
    get
    {
        return "Test";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果该值涉及计算(而不是像您的情况那样是文字),那么它实际上会被绑定为模块底层内部类中的静态只读字段(并在 getter 主体中引用)。如果您愿意,您可以使用 ILSpy 自行验证。

也就是说,如果您对编译器生成的实际 IL 感兴趣 - F# 作为一种语言没有单独的只读字段概念(因为 let 绑定值、记录字段等默认情况下是只读的)。它甚至不保留关键字。