1

VBの場合、Tのインターフェイスへの明示的なキャストが必要なのにOption Strict On、なぜそれを必要としないのですか?Nullable(Of T)T

つまり

Dim x As Integer? = 5
Dim y As Integer
Dim z As IComparable

y = x ' Fails to compile with error
      ' "Option Strict On disallows implicit conversions from 'Integer?' to 'Integer'."
z = x ' Succeeds

編集:@SSSによって示されるように(一種の)、答えの一部は、Nullable値は、まあ、null許容であり、可能性があるということですNothing。これは、インターフェースのような参照には問題ありません。したがって、この変換は、Tcaseへの変換(値がない場合に失敗する)とは異なり、常に成功するNullableため、暗黙の変換と見なすことができます。

私の質問は今「どうやって?」になります。Nullable(Of T)(独自のインターフェースを持たない)からT理論的に交渉されたインターフェースへの変換はどのように行われますか?

私は実装がbox Nullable<T>であると知っています、それはラッパーを効果的に取り除きNullableます、しかし私はここで概念を確認しています...

(したがって、ドキュメントを確認して、これが説明されているかどうかを確認します。)

4

3 に答える 3

1

問題がわかりませんか?

y = x 

xはNothingの値を保持できるため失敗する可能性がありますが、yはNothingの値を保持することはできません。ただし、IComparableインターフェイスでは、整数をNothingと比較できるため、割り当ては問題ありません。

ラウンドで交換する場合は、次の点に注意してください。

x = y

yのすべての値をxに割り当てることができるため、これは成功します。

次のように、整数をNothingと比較できることを確認できます。

MsgBox(5.CompareTo(Nothing))
于 2012-09-20T02:45:42.757 に答える
0

私がvb.netで言うことができることから、ステートメントinterfaceVariable = nullableVariableは本質的にと同等interfaceVariable = if(nullableVariable.HasValue, CType(nullableVariable.Value, interfaceType), Nothing)です。C#コンパイラは同じように処理するようです:interfaceVariable = nullableVariable;になりinterfaceVariable = nullableVariable.HasValue ? (interfaceType)nullableVariable.Value : null;ます。

タイプがnullableValue.Valueインターフェイスを実装している場合はnullableVariable.Value、値タイプの結果を返すか、例外をスローします。戻り値からインターフェースへのボクシングの変換が保証されているため、キャストは合法です。上記のコードが失敗する唯一の方法は、との呼び出しの間にnull許容変数が書き込まれる場合ですHasValueValueたとえばHasValue、変数はnull以外と見なされますがValue、nullと見なされ、例外がスローされます。interfaceVariable = nullableVariable書くことは一度だけnullをテストするので、例外は発生しないと私は信じています。代わりに、不確定な値がボックス化されます。

于 2012-09-20T14:42:16.747 に答える
0

まだ実際にドキュメントを読んでいないので、私は答えを試みるつもりです:

まず、より高いレベルの答えはNullable、インターフェイスへのキャストは「安全」であり、スローされないため、論理的にはWidening演算子であり、明示的である必要はないということです(にキャストする場合と比較してT、いつスローさ.HasValueれるFalseか。で暗黙的ではありませんOption Strict On)。

ただし、技術的には「方法」は少しあいまいです。の動作の一部はNullableリフレクションを介して利用可能なメタデータにエンコードされていますが、その「魔法」の多くは次の場所に隠されています。

  • の実行時の動作boxNullableしたがって、コンパイラは「リフティング」をいつ残すかを知っています)、および
  • Eric LippertがC#に対する回答で述べた他のポイントと、VB.NETでの同等のポイント。

VS2k5のベータ版の後半リリースでサポートするための変更を発表したS.Somasegarのブログ投稿もここに関連しているようです。Nullable

于 2012-09-21T03:38:19.253 に答える