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

我有一个类,当我尝试在另一个类中使用它时,我收到下面的错误。

using System; using System.Collections.Generic; using System.Linq; namespace MySite { public class Reminders { public Dictionary<TimeSpan, string> TimeSpanText { get; set; } // We are setting the default values using the Costructor public Reminders() { TimeSpanText.Add(TimeSpan.Zero, "None"); TimeSpanText.Add(new TimeSpan(0, 0, 5, 0), "5 minutes before"); TimeSpanText.Add(new TimeSpan(0, 0, 15, 0), "15 minutes before"); TimeSpanText.Add(new TimeSpan(0, 0, 30, 0), "30 minutes before"); TimeSpanText.Add(new TimeSpan(0, 1, 0, 0), "1 hour before"); TimeSpanText.Add(new TimeSpan(0, 2, 0, 0), "2 hours before"); TimeSpanText.Add(new TimeSpan(1, 0, 0, 0), "1 day before"); TimeSpanText.Add(new TimeSpan(2, 0, 0, 0), "2 day before"); } } } 

在另一个班级使用班级

 class SomeOtherClass { private Reminders reminder = new Reminders(); // error happens on this line: private dynamic defaultReminder = reminder.TimeSpanText[TimeSpan.FromMinutes(15)]; .... 

错误(CS0236):

 A field initializer cannot reference the nonstatic field, method, or property 

为什么会发生,如何解决?

这一行:

 private dynamic defaultReminder = reminder.TimeSpanText[TimeSpan.FromMinutes(15)]; 

您不能使用实例变量来初始化另一个实例变量。 为什么? 因为编译器可以重新排列这些 – 不能保证reminder将在defaultReminder之前被初始化,所以上面的行可能会抛出一个NullReferenceException

相反,只需使用:

 private dynamic defaultReminder = TimeSpan.FromMinutes(15); 

或者,在构造函数中设置值:

 private dynamic defaultReminder; public Reminders() { defaultReminder = reminder.TimeSpanText[TimeSpan.FromMinutes(15)]; } 

在MSDN上有关于此编译器错误的更多详细信息 – 编译器错误CS0236 。

您需要将该代码放入您的类的构造函数中:

 private Reminders reminder = new Reminders(); private dynamic defaultReminder; public YourClass() { defaultReminder = reminder.TimeSpanText[TimeSpan.FromMinutes(15)]; } 

原因是你不能使用一个实例变量来初始化另一个使用字段初始值设定项,因为字段初始值的执行顺序是未定义的。

你可以这样使用

 private dynamic defaultReminder => reminder.TimeSpanText[TimeSpan.FromMinutes(15)];