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

sum*_*ore 16 c# asp.net-mvc

我有一个Repository Class和一个Services Class,如下所示:

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
}
Run Code Online (Sandbox Code Playgroud)

抛出错误:

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

即使我已经使用DinnerRepository类,也要在Service Class中公开它的方法GetDinner().这适用于下面的代码.有没有其他选择,还是标准做法?我不能在这里使用静态方法..

public class Service
{

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

}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 19

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

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

    public Service()
    {
        repo = new DinnerRepository();
        dinner = repo.GetDinner(5);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这与您在问题底部显示的代码不同,因为它只声明局部变量.如果你只想要局部变量,那很好 - 但如果你需要实例变量,那么使用上面的代码.

基本上,现场初始化器的功能有限.从C#4规范的10.5.5.2节:

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

("因此"和"因此"对我来说是错误的方式 - 通过一个简单的名称引用一个成员是非法的,因为它引用了this- 我会ping Mads关于它 - 但这基本上是相关部分.)