Tengo una clase y cuando intento usarla en otra clase, recibo el siguiente error.
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");
}
}
}
Usando la clase en otra clase
class SomeOtherClass
{
private Reminders reminder = new Reminders();
// error happens on this line:
private dynamic defaultReminder = reminder.TimeSpanText[TimeSpan.FromMinutes(15)];
....
Error (CS0236):
A field initializer cannot reference the nonstatic field, method, or property
¿Por qué sucede y cómo solucionarlo?

partial classcon "partes" en varios archivos, el orden de los inicializadores de campo no está claro, ¡pero eso también se aplica a losstaticcampos!)staticcampos en lugar de campos de instancia.Necesitas poner ese código en el constructor de tu clase:
private Reminders reminder = new Reminders(); private dynamic defaultReminder; public YourClass() { defaultReminder = reminder.TimeSpanText[TimeSpan.FromMinutes(15)]; }La razón es que no puede usar una variable de instancia para inicializar otra usando un inicializador de campo.
fuente
puedes usar así
private dynamic defaultReminder => reminder.TimeSpanText[TimeSpan.FromMinutes(15)];fuente
=>no establece el valor real, pero ejecutará el código cada vez quedefaultReminderse acceda. Esto puede no ser intencionado y tener un impacto negativo en el rendimiento o generar una presión no deseada para GC, etc.private dynamic defaultReminder = reminder.TimeSpanText[TimeSpan.FromMinutes(15)];es un inicializador de campo y se ejecuta primero (antes de que cualquier campo sin inicializador se establezca en su valor predeterminado y antes de que se ejecute el constructor de instancia invocado). Los campos de instancia que no tienen inicializador solo tendrán un valor legal (predeterminado) después de que se completen todos los inicializadores de campo de instancia. Debido al orden de inicialización, los constructores de instancias se ejecutan en último lugar, por lo que la instancia aún no se crea en el momento en que se ejecutan los inicializadores. Por lo tanto, el compilador no puede permitir que se haga referencia a ninguna propiedad de instancia (o campo) antes de que la instancia de clase esté completamente construida. Esto se debe a que cualquier acceso a una variable de instancia como hacereminderreferencia implícitamente a la instancia (this) para decirle al compilador la ubicación de memoria concreta de la instancia a usar.Esta es también la razón por la
thisque no está permitido en un inicializador de campo de instancia.Los únicos miembros de tipo que se garantiza que se inicializarán antes de que se ejecuten los inicializadores de campo de instancia son los inicializadores de campo de clase (estáticos) y los constructores de clase (estáticos) y los métodos de clase. Dado que los miembros estáticos son independientes de la instancia, se puede hacer referencia a ellos en cualquier momento:
class SomeOtherClass { private static Reminders reminder = new Reminders(); // This operation is allowed, // since the compiler can guarantee that the referenced class member is already initialized // when this instance field initializer executes private dynamic defaultReminder = reminder.TimeSpanText[TimeSpan.FromMinutes(15)]; }Es por eso que los inicializadores de campo de instancia solo pueden hacer referencia a un miembro de clase (miembro estático). Estas reglas de inicialización del compilador asegurarán una instanciación de tipo determinista.
Para más detalles recomiendo este documento: Microsoft Docs: Declaraciones de clase .
Esto significa que un campo de instancia que hace referencia a otro miembro de instancia para inicializar su valor, debe inicializarse desde el constructor de instancia o el miembro referenciado debe declararse
static.fuente