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

时间:2011-10-06 08:43:42

标签: c# .net

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

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“必须是编译时常量”。对我来说,这似乎是一个完美的编译时常量,所以我不明白问题出在哪里。

8 个答案:

答案 0 :(得分:46)

不,表达式PersonRespository.ColumnID未被归类为编译时常量。表达式“ID”是,但这不是您使用的默认参数。

特别是,如果ColumnID是“只是一个普通字段”,那么对它的任何引用都将被解析为 as 一个字段 - 所以如果你编译一个引用该字段的程序集,然后更改值并重建包含PersonRepository的程序集,引用程序集看到该更改。

如果您将声明更改为:

 public const string ColumnID = "ID";

然后它一个编译时常量表达式。这意味着在我们之前的场景中,常量的值被烘焙到引用它的任何代码中 - 并且稍后更改值而不重新编译引用代码将不会更改该引用代码使用的值

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

答案 1 :(得分:5)

您必须将ColumnID声明为const

在代码中首次访问类时,static readonly字符串将被实例化,您也可以使用静态方法的返回值对其进行初始化,因此它不是编译器的编译时常量(即使在这种情况下,显然是一个人阅读代码。)

答案 2 :(得分:4)

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

readonly字段可以在构造函数中分配,而不是编译时间常量。 你现在编写的代码在初始化程序中运行(在构造函数之前)。 const字段作为常量'烘焙'。

答案 3 :(得分:3)

变化

public static readonly string ColumnID = "ID";

public const string ColumnID = "ID";

答案 4 :(得分:3)

  

readonly

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

答案 5 :(得分:3)

为了完整起见,以下是可选参数的三个有效默认值:(来自:MSDN: Named and Optional Arguments

  1. 常量表达
  2. new ValType()形式的表达式,其中ValType是值类型, 例如enumstruct; (注意:只能使用无参数构造函数)
  3. default(ValType)形式的表达式,其中ValType是值类型。

答案 6 :(得分:2)

public const string ColumnID = "ID";

答案 7 :(得分:2)

尝试更改此

public static readonly string ColumnID = "ID";

public const string ColumnID = "ID";