字段初始化项不能引用非静态字段、方法或属性
本文关键字:字段 方法 属性 静态 初始化 不能 引用 | 更新日期: 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
语句。