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

本文关键字:字段 方法 属性 静态 初始化 不能 引用 | 更新日期: 2023-09-27 18:08:21

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

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是一个编译时错误,因为变量初始化器通过simple-name引用任何实例成员都是一个编译时错误。

("因此"answers"因此"在我看来是错误的-通过简单名称引用成员是非法的,因为它引用了this -我会通知Mads -但这基本上是相关的部分)

即使初始化表达式保证按"文本顺序",实例字段初始化器访问this引用也是非法的,并且您在

中隐式地使用它
Dinner dinner = repo.GetDinner(5); 

相当于

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

我认为,最佳实践是将字段初始化保留为常量值或简单的new语句。