C# FileNameSizeDelimiteC必须是常量

C# FileNameSizeDelimiteC必须是常量,c#,C#,下面的代码给出了“FileNameSizeDelimiteC必须是常量”的问题,问题是什么 public const char FileNameSizeDelimiterC = '|'; public const string FileNameSizeDelimiter = Char.ToString(FileNameSizeDelimiterC); 问题在于Char.ToString是一种方法,就编译器而言,它不是常量。编译器在编译时不会运行任何代码。尽管事实上,你或我可能会看到这一点,并

下面的代码给出了“FileNameSizeDelimiteC必须是常量”的问题,问题是什么

public const char FileNameSizeDelimiterC = '|'; 
public const string FileNameSizeDelimiter = Char.ToString(FileNameSizeDelimiterC);

问题在于
Char.ToString
是一种方法,就编译器而言,它不是常量。编译器在编译时不会运行任何代码。尽管事实上,你或我可能会看到这一点,并说“它将永远是一样的”,编译器不能。原因是它不知道对于相同的输入,
Char.ToString
总是返回相同的输出。它同样可以是依赖于配置变量、一天中的时间或任何其他事情的东西。虽然语言开发人员可以包括一种方法来标记方法,使编译器可以这样做,但他们没有这样做,所以你的常量必须是常量


我假设在这种情况下,代码是示例代码,因此您不能只使用
“|”
,这似乎是同一件事?

问题在于
Char.ToString
是一种方法,就编译器而言,它不是常量。编译器在编译时不会运行任何代码。尽管事实上,你或我可能会看到这一点,并说“它将永远是一样的”,编译器不能。原因是它不知道对于相同的输入,
Char.ToString
总是返回相同的输出。它同样可以是依赖于配置变量、一天中的时间或任何其他事情的东西。虽然语言开发人员可以包括一种方法来标记方法,使编译器可以这样做,但他们没有这样做,所以你的常量必须是常量


我假设在这种情况下,代码是示例代码,因此您不能只使用
“|”
,这似乎是相同的东西?

Char。ToString
是一个函数,因此必须在运行时调用以获取值,这意味着您不能将其存储在值中。从文档(我的重点):

常量表达式是可以在编译时完全计算的表达式。因此,引用类型的常量的唯一可能值是字符串和空引用

不过,你可以做到:


Char.ToString
是一个函数,因此必须在运行时调用以获取值,这意味着您不能将其存储在值中。从文档(我的重点):

常量表达式是可以在编译时完全计算的表达式。因此,引用类型的常量的唯一可能值是字符串和空引用

不过,你可以做到:

public const char FileNameSizeDelimiterC = '|'; 
public readonly string FileNameSizeDelimiter = Char.ToString(FileNameSizeDelimiterC);