6

重複の可能性:
DateTimeプロパティのデフォルト値をDateTimeに設定します。System.ComponentModelのデフォルト値属性内になります。

カレンダーのようなコントロールを作成しています。ユーザーが表示する年を設定する必要があります。ただし、そうでない場合、SelectedYearのプロパティは実際の年である必要があります。

このデフォルト値を次のように設定してみます。

[DefaultValue(DateTime.Today.Year)]
public int SelectedYear{
    get{
        return _selYear;
    }
    set{
        _selYear = value;
        UpdateCalendar();
    }
}

そして、私は次のエラーが発生しました

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
4

7 に答える 7

7

YearプロパティDateTimeは計算値ですが、バイナリに格納されている不変の値である属性に埋め込もうとしています。これらの2つの概念には互換性がありません。

ここで実行したいのは、値がまだ設定されていないことを示しYear、その場合は現在の値を返すためのマーカーを用意することです。これは、null許容型を使用するのに適した場所です

int? _selYear;
public int SelectedYear {
  get { return _selYear ?? DateTime.Today.Year; }
  set { 
    _selYear = value;
    UpdateCalendar();
  }
}
于 2012-10-24T17:03:45.583 に答える
3

AmbientValueAttributeプロパティをデフォルト値に設定すると、実際には現在の日付を取得することを意味することを示すために使用します。

int _selYear = 0;

[AmbientValue(0)]
[DefaultValue(0)]
public int SelectedYear{
    get{
        if (_selYear == 0)
            return DateTime.Today.Year;
        return _selYear;
    }
    set{
        _selYear = value;
        UpdateCalendar();
    }
}

0の値を使用する場合は、null可能にすることができますが、nullを返すことはなく、nullの設定のみを許可します。

int _selYear = null;

[AmbientValue(null)]
[DefaultValue(null)]
public int? SelectedYear{
    get{
        return _selYear ?? DateTime.Today.Year;
    }
    set{
        _selYear = value;
        UpdateCalendar();
    }
}

これで、現在の年を表すnull値になります。

AmbientValueAttributeは、このプロパティをその値に設定すると、プロパティを取得したときに別の値が環境から返され、その場合の戻り値は現在の日付と同じように変化する可能性があることを意味します。

于 2012-10-24T17:14:58.743 に答える
1

プロパティの値を明示的に初期化する必要があります。DefaultValue属性は、デフォルトの値であるメタデータを提供するだけの値でプロパティを初期化しません。

型のctorで初期化することも、型を反映し、型メタデータの値によってプロパティを初期化するカスタムコードを記述することもできます。

于 2012-10-24T17:06:52.070 に答える
0

まあ、エラーはかなり明確です:

属性引数は定数式でなければなりません。

それで、それがうまくいったら、デフォルト値は実際には何でしょうか?さて、それはあなたがコードをコンパイルした年でしょう。おそらくあなたが望むものではありません。

本当にデフォルトで現在の年を返したい場合は、コンストラクターでそれを初期化するだけです。

于 2012-10-24T17:02:48.067 に答える
0

代わりにコンストラクターでこのようにしないsetのはなぜですか-backing field

_selYear = DateTime.Today.Year

defaultユーザーが設定しない場合は、常に値になります。

于 2012-10-24T17:03:20.700 に答える
0

DateTime.Today.Year毎年変化するため、定数値ではありません。_selYearこれを使用して、が指定されているかどうかを確認できます。

public int SelectedYear{
    get{
        if (_selYear.Equals(0)){
            return  DateTime.Today.Year;
        }
        else{
            return _selYear;
        }
    }
    set{
        _selYear = value;
        UpdateCalendar();
    }
}

これは、_selYearを0に開始したことを考慮しています。

于 2012-10-24T17:03:54.520 に答える
0

これは、DefaultValue定数値のみを受け入れるためです。あなたは以下のような別のアプローチを介してこれを行うことができます

public int SelectedYear{
    get{
        return _selYear == 0 ? DateTime.Now.Year : _selYear;
    }
    set{
        _selYear = value;
        UpdateCalendar();
    }
}

これがお役に立てば幸いです!!

于 2012-10-24T17:04:28.757 に答える