Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство

У меня есть class, и когда я пытаюсь использовать его в другом classе, я получаю ошибку ниже.

using System; using System.Collections.Generic; using System.Linq; namespace MySite { public class Reminders { public Dictionary 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а в другом classе

 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 .

Вам нужно поместить этот код в конструктор вашего classа:

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

Причина в том, что вы не можете использовать одну переменную экземпляра для инициализации другой с помощью инициализатора поля, потому что порядок выполнения инициализаторов полей не определен.

вы можете так использовать

 private dynamic defaultReminder => reminder.TimeSpanText[TimeSpan.FromMinutes(15)]; 
  • Почему переопределить operator ()?
  • Необработанный SQL-запрос Entity framework
  • Чтение переменной Javascript из элемента управления веб-браузера
  • Marshal.PtrToStructure (и обратно) и общее решение для сводной привязки
  • Подключение к Oracle Database через C #?
  • Обоснование принуждения некоторых операторов к участию
  • Что такое первая запись (int (*) (...)) 0 vtable в выводе g ++ -fdump-class-hierarchy?
  • Как удалить строку из GridView?
  • заполнять дерево из списка путей
  • Как использовать Linq для группировки каждого N числа строк
  • При использовании .net MVC RadioButtonFor (), как вы группируетесь, можно сделать только один выбор?
  • Давайте будем гением компьютера.