1. ホーム
  2. c#

[解決済み】nullableオブジェクトは値を持つ必要がある

2022-04-05 17:24:40

質問

例外の記述に矛盾がある。 Nullableオブジェクトは値を持たなければならない(?!)

これが問題なのです。

私の場合は DateTimeExtended クラスがあります。 を持っていること。

{
  DateTime? MyDataTime;
  int? otherdata;

}

とコンストラクタ

DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime.Value;
   this.otherdata = myNewDT.otherdata;
}

このコードを実行する

DateTimeExtended res = new DateTimeExtended(oldDTE);

を投げる。 InvalidOperationException をメッセージと一緒に送信します。

Nullableオブジェクトは値を持つ必要があります。

myNewDT.MyDateTime.Value - は有効で、通常の DateTime オブジェクトを作成します。

このメッセージの意味と、私のやり方が間違っているのでしょうか?

なお oldDTEnull . を削除しました。 Value から myNewDT.MyDateTime が、生成されたセッターのために同じ例外がスローされます。

解決方法は?

行を変更する必要があります。 this.MyDateTime = myNewDT.MyDateTime.Value; から this.MyDateTime = myNewDT.MyDateTime;

あなたが受け取っていた例外は .Value プロパティの Nullable DateTime を返す必要があるため DateTime (の契約はそうなっているので)。 .Value がないため、このようなことはできません。 DateTime を返すので、例外が発生します。

一般に、やみくもに .Value という事前知識がない限り、NULL可能な型にその変数 マスト には値が含まれます。 .HasValue のチェック)。

EDIT

以下は DateTimeExtended 例外を発生させない

class DateTimeExtended
{
    public DateTime? MyDateTime;
    public int? otherdata;

    public DateTimeExtended() { }

    public DateTimeExtended(DateTimeExtended other)
    {
        this.MyDateTime = other.MyDateTime;
        this.otherdata = other.otherdata;
    }
}

こんな感じでテストしてみました。

DateTimeExtended dt1 = new DateTimeExtended();
DateTimeExtended dt2 = new DateTimeExtended(dt1);

を追加します。 .Valueother.MyDateTime は例外を引き起こします。これを削除すると例外が解消されます。見る場所を間違えているようです。