可选参数“必须是编译时常量”

我有一个分为两个部分文件的类,如下所示:

public partial class PersonRepository : BaseRepository<Person> { public static readonly string ColumnID = "ID"; ... 

 public partial class PersonRepository : BaseRepository<Person> { public List<Person> GetByCompany(int companyID, string sortExpression = ColumnID) { ... 

但是编译器总是说sortExpression “必须是编译时常量”。 对我来说,这似乎是一个完美的编译时间常数,所以我不明白问题出在哪里。

不,expression式PersonRespository.ColumnID没有被分类为编译时常量。 expression“ID”是,但这不是你用作默认参数。

特别是,如果ColumnID是“只是一个普通的字段”,那么任何对它的引用都将被parsing一个字段 – 所以如果你编译一个引用这个字段的程序集,那么改变它的值并重build包含PersonRepository的程序集, 看到这种变化。

如果您将您的声明更改为:

  public const string ColumnID = "ID"; 

那么这一个编译时常量expression式。 这意味着在我们以前的情况下,常量的值会被烘焙到引用它的任何代码中,并在稍后更改该值,而不会重新编译引用代码将不会更改引用代码使用的值。

请参阅C#4语言规范的第7.19节,了解有关什么算作常量expression式的更多详细信息。

你必须声明你的ColumnIDconst

static readonlystring将在您的代码中第一次访问类时被实例化,并且您还可以使用静态方法的返回值初始化它,所以它不是编译器的编译时常量(即使在这种情况下,显然是为了阅读代码的人)。

const是用const关键字声明的东西。

只读字段可以在构造函数中赋值,而不是编译时间常量。 你现在编写的代码现在运行在初始化程序(在构造函数之前)。 const字段以常量“烘焙”。

更改

 public static readonly string ColumnID = "ID"; 

 public const string ColumnID = "ID"; 

readonly

readonly字段的值可以更改(在构造函数中)。 你需要一个const

为了完整起见,以下是可选参数的三个有效默认值:(来自: MSDN:命名参数和可选参数 )

  1. 一个不变的expression
  2. 一个new ValType()forms的expression式,其中ValType是一个值types,比如一个enum或一个struct ; (注意:只能使用无参数的构造函数)
  3. 表单的default(ValType)formsdefault(ValType) ,其中ValType是一个值types。
 public const string ColumnID = "ID"; 

试着改变这一点

 public static readonly string ColumnID = "ID"; 

 public const string ColumnID = "ID";