一尘不染

字段初始值设定项不能引用非静态字段,方法或属性

c#

我有一个课程,当我尝试在另一个课程中使用它时,出现以下错误。

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

为什么会发生以及如何解决?


阅读 556

收藏
2020-05-19

共1个答案

一尘不染

这行:

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

2020-05-19