被分配给“...”的表达式必须是常量。

36

这段代码有什么问题? 我收到了这个错误:“分配给 '....' 的表达式必须是常量”

public const string ConnectionString = System.IO.File.ReadAllText(@"D:\connection.ini");

你有没有阅读关于 const文档 - Jon
一个 'const' 值必须在编译时知道。在你的例子中,你要求编译器去执行一些随机的代码 - 它不会这样做。 - Rob
1
你的 File.ReadAllText 部分在运行时被评估,const 用于指定编译时表达式。你可以使用 readonly 替代。 - Soner Gönül
3
使用readonly代替const,并将静态的public static readonly string ConnectionString = System.IO.File.ReadAllText(@"D:\connection.ini");,注意现在它只是一个字段,只能在构造函数中更改。 - Alessandro D'Andria
不确定这是否是重复的问题。此问题涉及到带有错误的字段,而链接的问题则涉及局部变量。虽然出现了相同的错误消息,但原因和原因不同。 - Class Skeleton
每当我需要从表达式为 C# 常量赋值时,我使用以下语法具有相同效果。常量变量默认为静态。私有只读静态字符串 Const_NAME = ConfigurationManager.AppSettings.Get("Key"); - Malhaar Punjabi
1个回答

53

在编译时必须知道一个常量的值,请使用readonly代替,它将有类似的效果。


15
更相似的应该是 static readonly - Silvermind
@Silvermind 没错,但是 static readonly 意味着如果在执行静态构造函数时文件不存在,那么没有明智的方法可以从错误中恢复,因此我认为这不会比在此处使用 readonly 实例字段更好。 - user743382
@Silvermind 当然,有其他方法可以让它正常工作而没有缺点,例如使用 static readonly Lazy<string> 字段(可从 static string 属性中访问),使用 LazyThreadSafetyMode.PublicationOnly 确保如果抛出异常,则不会缓存该异常。 - user743382
1
请问能否给我在评论区的额外投票吗?你们占用了我的空间,谢谢!:-) - Steven Wood
1
@StevenWood 使用readonly代替,它会有类似的效果,我同意你的观点。但是对于switch case语句不起作用。 - MSTdev
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接