Mam klasę i kiedy próbuję użyć jej w innej klasie, otrzymuję błąd poniżej.Inicjator pól nie może odwoływać się do niestatycznego pola, metody ani właściwości
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");
}
}
}
Korzystanie z klasy do innej klasy
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
Dlaczego tak się dzieje i jak to naprawić?
Java jest bardziej „wyrozumiały” dla tego rodzaju konstrukcji. Nie wiem, czy to dobrze. http://stackoverflow.com/questions/1494735/initialization-order-of-static-fields-in-static-class –
Nie, kompilator nie może zmienić kolejności inicjalizatorów. Specyfikacja języka C# określa w sekcji "10.5.5.2 Inicjalizacja pola instancji" następujące: __ Inicjatory zmiennych są wykonywane w kolejności tekstowej, w której pojawiają się w deklaracji klasy .__ Powtórzono to nawet w "Instancji 10.11.2 inicjatory zmiennych ", gdzie mówią: __ Inicjatory zmiennych są wykonywane w kolejności tekstowej, w której pojawiają się w deklaracji klasy .__ Twoje wyjaśnienie jest błędne. Zamówienie zostało naprawione. Powodem, dla którego jest zabroniony, jest to, że projektanci C# chcieli tego w ten sposób. –
(Tylko w przypadku "klasy częściowej" z "częściami" w kilku plikach jest niejasna kolejność inicjalizacji pól, ale to dotyczy również pól 'statycznych') –