109

クラスがあり、それを別のクラスで使用しようとすると、以下のエラーが発生します。

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

なぜそれが起こり、どのように修正するのですか?

4

4 に答える 4

157

この行:

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 - Compiler Error CS0236を参照してください。

于 2013-01-21T13:02:34.320 に答える
25

そのコードをクラスのコンストラクターに入れる必要があります。

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

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

その理由は、あるインスタンス変数を使用して、フィールド初期化子を使用して別のインスタンス変数を初期化できないためです。

于 2013-01-21T13:02:50.840 に答える