我有一个分为两个部分文件的类,如下所示:
public partial class PersonRepository : BaseRepository<Person>
{
public static readonly string ColumnID = "ID";
...
Run Code Online (Sandbox Code Playgroud)
和
public partial class PersonRepository : BaseRepository<Person>
{
public List<Person> GetByCompany(int companyID, string sortExpression = ColumnID)
{
...
Run Code Online (Sandbox Code Playgroud)
但编译器一直说sortExpression"必须是编译时常量".对我来说,这似乎是一个完美的编译时常量,所以我不明白问题出在哪里.
Jon*_*eet 48
不,表达式PersonRespository.ColumnID不被归类为编译时常量.表达式"ID"是,但这不是您使用的默认参数.
特别是,如果ColumnID"只是一个普通的字段",那么对它的任何引用都将被解析为一个字段 - 所以如果你编译一个引用该字段的程序集,然后更改该值并重建包含的程序集PersonRepository,引用程序集将会看到那种变化.
如果您将声明更改为:
public const string ColumnID = "ID";
Run Code Online (Sandbox Code Playgroud)
那么它是一个编译时常量表达式.这意味着在我们之前的场景中,常量的值被烘焙到引用它的任何代码中 - 并且稍后更改值而不重新编译引用代码将不会更改该引用代码使用的值.
有关什么算作常量表达式的更多详细信息,请参阅C#4语言规范的第7.19节.
你必须申报你ColumnID的const.
static readonly在代码中首次访问类时,将实例化该字符串,并且您还可以使用静态方法的返回值对其进行初始化,因此它不是编译器的编译时常量(即使在这种情况下,它显然是对于阅读代码的人而言.
const 是用 const 关键字声明的东西。
readonly 字段可以在构造函数中分配,并且它不是编译时常量。您现在编写的代码在初始化程序中运行(在构造函数之前)。const 字段被“烘焙”为常量。
改变
public static readonly string ColumnID = "ID";
Run Code Online (Sandbox Code Playgroud)
到
public const string ColumnID = "ID";
Run Code Online (Sandbox Code Playgroud)