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



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



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

}
}


использование класса в другом классе



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


почему это происходит и как это исправить?

514   3  
c#

3 ответов:

эта строка:

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.

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

private Reminders reminder = new Reminders();
private dynamic defaultReminder;

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

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

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

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

Comments

    Ничего не найдено.