9

これは私にはバグのようです...

私は、そのように定義された自動プロパティを受け入れます。

public decimal? Total { get; set; }

それらが最初にアクセスされたときはnullになります。それらは初期化されていないので、もちろんnullです。

しかし、+ =で値を設定した後でも、この10進数は?まだnullのままです。だから後:

Total += 8;

合計はまだnullです。これはどのように正しいのでしょうか?(null + 8)を実行していることは理解していますが、8に設定する必要があるという意味で検出されないのは奇妙に思えます...

補遺:

私は質問で「null+8」のポイントを作成しましたが、文字列で機能することに注意してください。したがって、null + "hello"は問題なく実行され、"hello"が返されます。したがって、舞台裏では、文字列を「hello」の値を持つ文字列オブジェクトに初期化しています。動作は他のタイプのIMOでも同じである必要があります。文字列がnullを値として受け入れることができるためかもしれませんが、それでもnull文字列は初期化されたオブジェクトではありませんよね?

おそらく、文字列がnull許容ではないからです...

4

10 に答える 10

31
public decimal? Total { get; set; }

null「未知の値」と考えてください。あなたが未知の量の何かを持っていて、さらに8つ追加すると、あなたは今何個持っていますか?

答え: 不明です。

Null 許容変数の操作

未知の値を操作すると、既知の結果が得られる場合あります。

public bool? State { get; set; }

次のステートメントには、不明な値が含まれていますが、既知の解決策があります。

State = null;
nextState = State & false;         // always equals false
nextState = State & true;          // still unknown (null)

nextState = State | true;          // always true
nextState = State | false;         // still unknown (null)

パターンが見えますか?

もちろん、 のときに 0 と同等 (等しい) にしたい 場合は、null 合体演算子を使用して、次のように記述できます。Totalnull

Total = (Total ?? 0) + 8;

である場合を除きTotal、方程式での値を使用します。その場合、値 0 を使用します。null

于 2009-08-26T15:01:53.727 に答える
7
Null + 8 = Null

前にゼロで設定する必要があります。

于 2009-08-26T14:53:42.133 に答える
5

null未知の値を意味し、

unknown value + known value = still unknown value
于 2009-08-26T14:53:51.650 に答える
3

最初の呼び出しで初期化し、その後インクリメントするためのワンライナーを次に示します。

    public void InitializeOrIncrement(decimal value)
    {
        // if Total is null then initialize, otherwise increment
        Total = (Total == null) ? value : Total + value;
    }

    public decimal? Total { get; set; }
于 2009-08-26T15:01:27.207 に答える
2

MSDNから:

null 許容型との比較を実行するときに、null 許容型のいずれかの値が null で、もう一方の値が null でない場合、!= (等しくない) を除くすべての比較は false と評価されます。特定の比較が false を返すため、反対のケースが true を返すと想定しないことが重要です。

したがって、意図したとおりに機能します。

于 2009-08-26T14:55:37.963 に答える
1

他の人が指摘しているように、null はゼロではありません。長い目で見れば、null 整数のデフォルトを 0 にする方が便利に思えるかもしれませんが、手遅れになるまで気付かないような奇妙な結果が生じる可能性があります。

簡単な例として、データ フィードの 1 つが失敗し、結果セットに null が入力されたとします。計算ではヌルがゼロとして扱われ、引き続き結果が生成されます。数値はまだ出ているので、間違っている可能性がありますが、何か重大な問題が発生していることに気付かないかもしれません.

于 2010-04-13T09:53:26.663 に答える
1

私はそれが理にかなっていることを知っています

public decimal? Total { get; set; }

Total = (Total ?? 0) + 8;

しかし、それは簡単に行うことができません:

public decimal Total { get; set; }

合計の初期値は 0 です

于 2009-08-26T15:46:03.360 に答える
0

合計の値を設定するには

Total = 8;

Nullable 型を読んで、それらがどのように機能するかを理解することをお勧めします。を使用して、プロパティに値があるかどうかを確認できますHasValue

MSDNから:

オペレーター

定義済みの単項演算子と二項演算子、および値の型に存在するユーザー定義の演算子は、null 許容型でも使用できます。これらの演算子は、オペランドが null の場合、null 値を生成します。それ以外の場合、演算子は含まれている値を使用して結果を計算します。例えば:

int? a = 10;
int? b = null;

a++;         // Increment by 1, now a is 11.
a = a * 10;  // Multiply by 10, now a is 110.
a = a + b;   // Add b, now a is null.
于 2009-08-26T14:55:18.120 に答える
0

Null はゼロと同じではありません。ゼロプラス 8 は 8 ですが、ゼロプラス 8 ですか? 常にヌル。無限と同じように、何でもまだ無限です - それは未定義です。

これは null に普遍的に当てはまることがわかります。すべてのデータベース (少なくとも私がこれまでに使用したことのあるもの) で同じ結果が得られます。

于 2009-08-26T15:04:25.627 に答える
0

公開小数?合計{取得; 設定; }

このようなものは機能しますか?値がまだ設定されていない場合は、ある種の自動初期化。

public decimal? Total
{
  get { return this.totalValue;}
  set
  { 
     if(totalValue == null) { this.totalValue = 0;}
     this.totalValue = value;
  }
}

private decimal? totalValue;
于 2009-08-26T15:04:50.523 に答える