Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可选参数“;必须是编译时常量;_C#_.net - Fatal编程技术网

C# 可选参数“;必须是编译时常量;

C# 可选参数“;必须是编译时常量;,c#,.net,C#,.net,我将一个类划分为两个部分文件,如下所示: public partial class PersonRepository : BaseRepository<Person> { public static readonly string ColumnID = "ID"; ... 公共部分类PersonRepository:BaseRepository { 公共静态只读字符串ColumnID=“ID”; ... 及 公共部分类PersonRepository:BaseRe

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

public partial class PersonRepository : BaseRepository<Person>
{
    public static readonly string ColumnID = "ID";
    ...
公共部分类PersonRepository:BaseRepository
{
公共静态只读字符串ColumnID=“ID”;
...

公共部分类PersonRepository:BaseRepository
{
公共列表GetByCompany(int companyID,string sortExpression=ColumnID)
{
...

但是编译器一直说,
sortExpression
“必须是一个编译时常量”。在我看来,它似乎是一个完美的编译时常量,所以我不知道问题出在哪里。

您必须将
列ID
声明为
常量


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

只读字段可以在构造函数中赋值,而不是在编译时常量中赋值。 您现在编写的代码在初始值设定项中运行(在构造函数之前)。
常量字段被“烘焙”为常量。

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

特别是,如果
ColumnID
是“一个普通字段”,那么对它的任何引用都将解析为字段-因此,如果编译引用该字段的程序集,然后更改该值并重新生成包含
PersonRepository
的程序集,则引用的程序集将看到该更改

如果您将声明更改为:

 public const string ColumnID = "ID";
然后它是一个编译时常量表达式。这意味着在我们前面的场景中,常量的值被烘焙到引用它的任何代码中——并且在以后不重新编译引用代码的情况下更改该值不会更改引用代码使用的值

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

更改

public static readonly string ColumnID = "ID";
public static readonly string ColumnID = "ID";

试着改变这个

只读


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

仅为了完整性,以下是可选参数的三个有效默认值:(from:)

  • 恒量表达式
  • 形式为
    new ValType()
    的表达式,其中
    ValType
    是值类型, 例如
    enum
    struct
    ;(注意:只能使用无参数构造函数)
  • 一种形式为
    default(ValType)
    的表达式,其中
    ValType
    是一种值类型

  • 谢谢!你能解释一下为什么我的表达式不是编译时常量吗?@Alessandro:All
    const
    成员都是隐式静态的。好的,但是如果我在与
    GetByCompany
    相同的程序集中有
    readonly ColumnID
    ,那么它与
    const ColumnID
    有什么不同?我仍然需要重新编译引用的程序集to获得更改,对吗?另外,我可以随时编写
    …string sortExpression=null){sortExpression=sortExpression??ColumnID;..
    变量默认参数的想法似乎很有前途。它被认为是一种不好的做法,还是仅仅因为一些技术上的细微差别就被禁止了?@PawełAudionysos:这是不同的,因为不能将值烘焙到它的每次使用中,这对于
    const
    表达式来说是正确的哦,看,常数必须是一个值,我从来没有真正使用过它…但是最后一个问题呢?
    public const string ColumnID = "ID";
    
    public const string ColumnID = "ID";
    
    public static readonly string ColumnID = "ID";
    
    public const string ColumnID = "ID";