可选参数“必须是编译时常量”
我有一个分为两个部分文件的类,如下所示:
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式的更多详细信息。
你必须声明你的ColumnID
为const
。
static readonly
string将在您的代码中第一次访问类时被实例化,并且您还可以使用静态方法的返回值初始化它,所以它不是编译器的编译时常量(即使在这种情况下,显然是为了阅读代码的人)。
const是用const关键字声明的东西。
只读字段可以在构造函数中赋值,而不是编译时间常量。 你现在编写的代码现在运行在初始化程序(在构造函数之前)。 const字段以常量“烘焙”。
更改
public static readonly string ColumnID = "ID";
至
public const string ColumnID = "ID";
readonly
readonly
字段的值可以更改(在构造函数中)。 你需要一个const
。
为了完整起见,以下是可选参数的三个有效默认值:(来自: MSDN:命名参数和可选参数 )
- 一个不变的expression
- 一个
new ValType()
forms的expression式,其中ValType
是一个值types,比如一个enum
或一个struct
; (注意:只能使用无参数的构造函数) - 表单的
default(ValType)
formsdefault(ValType)
,其中ValType
是一个值types。
public const string ColumnID = "ID";
试着改变这一点
public static readonly string ColumnID = "ID";
至
public const string ColumnID = "ID";
- Visual Studio:有没有办法折叠所有的解决scheme资源pipe理器项目?
- C#和不变性和只读字段…一个谎言?
- 等待try / catch / finally的一个好的解决scheme?
- 你能捕捉到C#代码中的本机exception吗?
- C#中myCustomer.GetType()和typeof(Customer)有什么区别?
- Gmail错误:SMTP服务器需要安全连接或客户端未通过身份validation。 服务器响应是:5.5.1需要身份validation
- 如何将SecureString转换为System.String?
- 如何在C#中dynamic创build一个类?
- UrlEncode通过控制台应用程序?