Um inicializador de campo não pode fazer referência ao campo, método ou propriedade não estáticos

Eu tenho uma aula e quando tento usar em outra class eu recebo o erro abaixo.

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"); } } } 

Usando a class em outra class

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

Erro (CS0236):

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

Por que isso acontece e como consertar isso?

Está linha:

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

Você não pode usar uma variável de instância para inicializar outra variável de instância. Por quê? Como o compilador pode reorganizá-los – não há garantia de que o reminder seja inicializado antes de defaultReminder , portanto, a linha acima pode lançar uma NullReferenceException .

Em vez disso, basta usar:

 private dynamic defaultReminder = TimeSpan.FromMinutes(15); 

Como alternativa, configure o valor no construtor:

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

Há mais detalhes sobre esse erro do compilador no MSDN – Compiler Error CS0236 .

Você precisa colocar esse código no construtor da sua class:

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

A razão é que você não pode usar uma variável de instância para inicializar outra usando um inicializador de campo, porque a ordem de execução dos inicializadores de campo é indefinida.

você pode usar assim

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