17

重複の可能性:
C# は値の型を null と比較しても問題ありません

nullC# で null 非許容型に代入しようとすると、次のようになります。

System.DateTime time = null;

コンパイル時エラーが発生します。

エラー CS0037: Null 非許容型であるため、null を 'System.DateTime' に変換できません

これは理にかなっています。しかし、同じタイプを と比較するとnull:

System.DateTime time = obtainFromSomewhere();
if( time == null ) {
    //whatever;
}

コンパイル時エラーはありません。これは私には意味がありません。割り当てることができない場合null、なぜそうなるのnullですか?

null 非許容型を と比較できるのはなぜnullですか?

4

5 に答える 5

18

これが で機能する理由は、独自の演算子を定義しているDateTimeためです。そのため、 で使用できる演算子の持ち上げられたバージョンを取得します。との両方が に暗黙的に変換される可能性があるため、比較はコンパイルされますが、実行時に常に false と評価されます。DateTime==DateTime?DateTimenullDateTime?

私の元の回答が質問の例をカバーしていなかったという事実を指摘してくれた Matt Ellen に感謝します。

于 2011-04-19T08:15:56.003 に答える
5

ボクシングのせいです。

DateTimeとしてボックス化できるobjectため、比較できる参照になりますnull(ただし、常に になりますfalse)。

ただし、オブジェクト ( null) はボックス化解除して に戻すDateTimeことができないため、 に割り当てることはできませんDateTime

例:あなたはできる

object now = DateTime.Now;
bool isNull = now == null

編集: Brian Rasmussen が指摘したように、私はボクシング理論に誤りがありました。私の例やのようにオブジェクトに明示的にキャストされた場合にのみ、ボクシングが発生します(object)DateTime.Now == null

于 2011-04-19T08:11:11.710 に答える
2

.NET 2.0 以降、null 許容型への暗黙的な変換があります (Eric Lippert の発言を参照してください)

コンパイラは、変換が行われたことを示す次の警告を表示します。

C:\>c:\windows\Microsoft.NET\Framework\v2.0.50727\csc test.cs
Microsoft (R) Visual C# 2005 コンパイラ バージョン 8.00.50727.4927
Microsoft (R) Windows (R) 2005 フレームワーク バージョン 2.0.50727 の場合

test.cs(16,12): 警告 CS0464: タイプ 'int?' の null と比較していますか? 常に「false」を生成します

null 許容型を持たない .NET 1.1 では、コード サンプルは合法ではありませんでした。

C:\>c:\windows\Microsoft.NET\Framework\v1.1.4322\csc test.cs
Microsoft (R) Visual C# .NET コンパイラ バージョン 7.10.3052.4
Microsoft (R) .NET Framework バージョン 1.1.4322 用
Copyright (C) Microsoft Corporation 2001-2002. 全著作権所有。

test.cs(12,13)​​: エラー CS0019: 演算子 '==' は型 'System.DateTime' および '' のオペランドに適用できません
于 2011-04-19T08:51:28.960 に答える
1

私の意見では、NULL は型のない実数値ではないため、これは許可されています。

以下のようなコードが許可されているのは良いことです:

System.DateTime time = obtainFromSomewhere(); // allways a date
System.DateTime? otherTime = obtainFromSomewhereElse(); // null if nothing planned

if (time == otherTime)
{
    // match
    ...
}

とにかくnull なしで何をしますか?

于 2011-04-19T08:26:49.260 に答える
1

null 許容型である必要があります。

System.DateTime? time = null;

コードは次のようになります。

System.DateTime? time = obtainFromSomewhere();
if( time.HasValue ) {
    //use time.Value;
}

ただし、obtainFromSomewhere関数は型を返す必要があることに注意してくださいDateTime?

于 2011-04-19T08:13:16.593 に答える