静态字符串的链接插值无法按预期工作



我使用了这样的代码:

public static class Program {
public static void Main() {
Console.WriteLine(hello);
}
internal static readonly string hello = $"hola {name} {num}";
internal static readonly string name  = $"Juan {num}";
public const int num = 4;
}

在这种情况下,当我得到hello的值时,它返回给我"hola 4",因此在插入另一个使用插值的字符串时似乎存在问题。 我的预期行为是"hola Juan 4 4",或者如果语言不支持这种链式插值,则编译时会出现错误。

有谁知道为什么C#会有这种行为?

静态字段按声明顺序进行初始化。所以发生的事情是:

  1. 最初,helloname都是nullnum是一个常量。
  2. hello已初始化。name仍然null.但是,num是一个常量,因此可以正确替换。hello具有"hola 4"
  3. name已初始化。

为什么num是一个常量这一事实会有所不同?请记住,const 的值由编译器在编译时直接替换到使用它的位置。因此,如果您查看编译器生成的内容,您会看到:

public static class Program
{
internal static readonly string hello = string.Format("hola {0} {1}", name, 4);
internal static readonly string name = string.Format("Juan {0}", 4);
public const int num = 4;
public static void Main()
{
Console.WriteLine(hello);
}
}

(图片由夏普实验室提供(

请注意 const 的值是如何编译到使用它的位置的


当你有相互依赖的静态字段时,你要么需要非常小心它们的声明顺序,要么通常更安全(也更易读!(只使用静态构造函数:

public static class Program {
static Program() {
name = $"Juan {num}";
hello = $"hola {name} {num}";
}
public static void Main() {
Console.WriteLine(hello);
}
internal static readonly string hello;
internal static readonly string name;
public const int num = 4;
}

您可以切换helloname的位置,例如,

internal static readonly string name = $"Juan {num}";
internal static readonly string hello = $"hola {name} {num}";

因为当hello分配时,尚未分配name

重新排序后namehello,它将根据需要打印

印刷品 => "霍拉胡安 4 4">

最新更新