3

理解するための小さな質問: null 可能な日時が 2 つあります。作成時刻と更新時刻を読み上げましたが、どちらも入力できます。だから私はどちらが遅いかを確認したい:

lastChangedIndrole = (tmpCreate > tmpUpdate ? tmpCreate : tmpUpdate);

しかし、ここでいくつかの奇妙なことが起こります。fe tmpUpdate が null の場合はエラーがスローされると予想されますが、何かを返すように見えますが、正しい値ではなく、2 番目の値 (私の例では更新) だけが返されます。

わからないことはありますか?コードはミリ秒を 1900 までチェックし、null 値がある場合はエラーがスローされると思います。しかし、これは起こりません。それは私が理解できない魔法ですか?

PS: を表す特別な言葉はありますか? vbのIIFのようなコンストラクター? 何かを探すのは大変です。

おかげさまで、今週も良いスタートを切ることができました

マティアス

4

6 に答える 6

1

null 許容値を他の null 許容値または null 非許容値と比較すると、null 非許容型の演算子が「持ち上げられ」、対応する null 許容型にも適用されます。

ただし、特別な処理により、どちらかまたは両方が null の場合が処理されます。

LINQPadの例を次に示します。

void Main()
{
    int? a = 10;
    int? b = null;

    (a > b).Dump();
    (b > a).Dump();
    (a == b).Dump();
    (a != b).Dump();
}

出力:

False
False
False
True

ご覧のとおり、一方が である 2 つの null 許容 int を比較するとnull、等値演算子のみが期待される結果を生成します。

a変数を null 非許容の intにすると、次のようになります。

int a = 10;

それ以外の場合はコードを保持すると、まったく同じ結果が生成されます。

両方が null の場合はどうなりますか?

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

プロデュース:

False
False
True
False

結論:

  • 等値演算子 (==および) は、null 許容型の を!=正しく処理しますnull
  • 小なりまたは大なり演算子はそうではありません。比較を切り替えてもfalse、オペランドの 1 つが である場合は返されます。null基本的に、10は より小さくも大きくもありませんnull

.Valuenull 許容型の値のプロパティを読み取ろうとするnullと、例外がスローされますが、演算子はプロパティを直接取得するの.Valueではなく、最初にプロパティをチェックして.HasValueから、実際の比較を試みる前にこれらのケースを処理します。

于 2013-08-12T11:43:02.547 に答える