Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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#_Asp.net Mvc - Fatal编程技术网

C# 字段初始值设定项不能引用非静态字段、方法或属性?

C# 字段初始值设定项不能引用非静态字段、方法或属性?,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个存储库类和一个服务类,如下所示: public class DinnerRepository { DinnerDataContext db = new DinnerDataContext(); public Dinner GetDinner(int id) { return db.Dinners.SingleOrDefault(d => d.DinnerID == id); } // Others Code

我有一个存储库类和一个服务类,如下所示:

public class DinnerRepository
{
    DinnerDataContext db = new DinnerDataContext();

    public Dinner GetDinner(int id)
    {
        return db.Dinners.SingleOrDefault(d => d.DinnerID == id);   
    }

// Others Code        
}



public class Service
{
        DinnerRepository repo = new DinnerRepository(); 
        Dinner dinner = repo.GetDinner(5);

// Other Code
}
这会引发错误:

字段初始值设定项不能引用非静态字段、方法或属性

尽管我已经插入了DinnerRepository类以在服务类中公开其方法GetDinner()。这在下面的代码中运行良好。是否有替代方案或是标准做法?我不能在这里使用静态方法

public class Service
{

    public Service()
    {
        DinnerRepository repo = new DinnerRepository(); 
        Dinner dinner = repo.GetDinner(5);
    }

}

就我个人而言,我只是初始化构造函数中的字段:

public class Service
{
    private readonly DinnerRepository repo;
    private readonly Dinner dinner;

    public Service()
    {
        repo = new DinnerRepository();
        dinner = repo.GetDinner(5);
    }
}
请注意,这与问题底部显示的代码不同,因为这只是声明局部变量。如果您只需要局部变量,这很好——但如果您需要实例变量,则使用上述代码

基本上,字段初始值设定项的功能是有限的。根据C#4规范第10.5.5.2节:

实例字段的变量初始值设定项不能引用正在创建的实例。因此,在变量初始值设定项中引用
this
是编译时错误,因为变量初始值设定项通过简单名称引用任何实例成员是编译时错误


(对我来说,“Thouse”和“Thouse”看起来是错误的-通过简单的名称引用成员是非法的,因为它引用了
这个
-我会对此发疯的-但这基本上是相关的部分。)

即使初始化表达式保证在,对于实例字段初始值设定项来说是非法的,并且您在中隐式使用它

Dinner dinner = repo.GetDinner(5); 
这相当于

Dinner dinner = this.repo.GetDinner(5);

IMHO的最佳实践是将字段初始化保留为常量值或一个简单的
new
语句。任何比这更复杂的问题都应该交给构造函数。

是的,当前版本的内容是“因为我们在
简单名称
s上有一个编译时错误,所以我们将引用
这个
作为一个错误”,而不是反过来。@JonSkeet这种行为的原因是字段在构造函数之前初始化。因此,当您尝试初始化字段时,没有实例成员。这就是为什么在类实例化之前不能使用它们的原因,对吗?@UfukSURMEN:不太可能。。。该对象已经存在,但它会引起一些很难解释的bug。(无可否认,有时候这很烦人……)