2017-07-10 33 views
2

私はnullは、例えば、Nullable<>タイプのインスタンスとして評価しないという事実に出くわした手動型チェックを関与テストを書く一方でint?nullが有効である割り当てながら(int?と同じである)タイプNullable<int>のために次の文は、nullがNullable <>型のインスタンスではないのはなぜですか?

null is int? 

falseです。なぜこれはそうですか?混乱することができる何

+1

暗黙的な変換のため、null可能なintにnullを割り当てることができます。しかし、彼らは同じ種類ではありません。 – NtFreX

+0

https://stackoverflow.com/questions/8204578/what-is-the-type-of-null-literal – CodeCaster

+3

@NtFreXコメントに追加: '' 'is'''は型をチェックし、==は等価をチェックします。次のステートメントはtrueです: '' 'int?バツ; if(x == null) '' ' –

答えて

2

怒鳴るですさて、なぜnullablesは特別すべきですか?これはのために任意の参照型、期間は立っていません。

var isObject = null is object; 

はあなたのコンパイル時のエラーを与える:

Error CS0184: The given expression is never of the provided ('object') type

Nullable<T>がここに赤いニシンです。

nullのタイプは、暗黙的な変換があるのでヌルタイプと任意の参照型またはnull許容型への割り当て可能である(§2.4.4.6)。明確化のために一部を太字

The is operator is used to dynamically check if the run-time type of an object is compatible with a given type. The result of the operation E is T, where E is an expression and T is a type, is a boolean value indicating whether E can successfully be converted to type T by a reference conversion, a boxing conversion, or an unboxing conversion. The operation is evaluated as follows, after type arguments have been substituted for all type parameters:

  1. If E is an anonymous function, a compile-time error occurs
  2. If E is a method group or the null literal, or if the type of E is a reference type or a nullable type and the value of E is null, the result is false. (...)

:仕様に従って

このis演算子は、以下の方法(§7.10.10)が働きます。

thisthis answerを参照してください。

0

nullが値とタイプすることができることです。

nullを比較または割り当てる場合は、最初に値をNullableに変換するために、次の暗黙的な変換が使用されます。

public static implicit operator Nullable<T> (
    T value 
) 

あなたは値ではなく、タイプの比較が行われますないisを使用している場合。 nullnullであり、Nullable<T>ではないため、それらは等しくありません。

0

ソート:値の型をnullableにすると、nullはその型に変換されません。nullはその型ではありません。変数がnullに割り当てられている場合、nullableの場合、sturctのHasValueプロパティはfalseになります。ボクシングはnullの参照を返しますが、それはその特定の値の型であることを意味しません。

あなたが実装を検討する必要があると

Nullable<T> 

の作業基本的性質がNULL可能な構造の 二つの基本的なメンバーがhasValueはとValueプロパティです。 NullableオブジェクトのHasValueプロパティがtrueの場合、Valueプロパティを使用してオブジェクトの値にアクセスできます。 HasValueプロパティがfalseの場合、オブジェクトの値は未定義で、ValueプロパティにアクセスしようとするとInvalidOperationExceptionがスローされます。

ボクシングとアンボクシング NULL可能タイプがボックス化され、共通言語ランタイムに自動的にボックスのNullableオブジェクト、いないのNullableオブジェクト自体の根本的な値。つまり、HasValueプロパティがtrueの場合、Valueプロパティの内容はボックス化されます。 null可能な型の基になる値がアンボックス化されると、共通言語ランタイムは基になる値に初期化された新しいNullable構造体を作成します。 null可能な型のHasValueプロパティがfalseの場合、ボクシング操作の結果はnullになります。したがって、ボックス化されたNULL可能型がオブジェクト引数を必要とするメソッドに渡された場合、そのメソッドは引数がnullの場合を処理するように準備する必要があります。 NULLがnull可能な型にボックス化されていない場合、共通言語ランタイムは新しいNullable構造体を作成し、HasValueプロパティーをfalseに初期化します。

私はちょうどそれが全体のドキュメントのリンクを読み取るためのあなたの穴のコンセプト に関するいくつかのアイデアを与えるだろう、Microsoftのドキュメントからこの行をコピーしたが

https://docs.microsoft.com/en-us/dotnet/api/system.nullable-1?view=netframework-4.7

関連する問題