Ho una classe e quando provo ad usarlo in un'altra classe, ricevo l'errore seguente.Un inizializzatore di campo non può fare riferimento al campo, metodo o proprietà non statica
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");
}
}
}
Uso della classe in un'altra classe
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
Perché accade e come risolvere il problema?
Java è più 'perdono' per questo tipo di costrutti. Non so se sia una buona cosa. http://stackoverflow.com/questions/1494735/initialization-order-of-static-fields-in-static-class –
No, il compilatore non può riorganizzare gli inizializzatori. Gli stati della specifica della lingua C#, nella sezione "Inizializzazione del campo Istanza 10.5.5.2", sono i seguenti: __L'inizializzazione delle variabili viene eseguita nell'ordine testuale in cui compaiono nella dichiarazione della classe .__ Ciò viene ripetuto anche in "Istanza 10.11.2" inizializzatori variabili "dove dicono: __I inizializzatori variabili vengono eseguiti nell'ordine testuale in cui appaiono nella dichiarazione della classe .__ Quindi la tua spiegazione è sbagliata. L'ordine è fisso. Il motivo per cui non è consentito è che i progettisti di C# lo volessero in quel modo. –
(Solo nel caso di una 'classe parziale' con" parti "in diversi file l'ordine degli inizializzatori di campo non è chiaro, ma vale anche per i campi' static'!) –