2010-12-14 11 views
3

null可能な整数から予期せぬ動作を除いて私の頭を引き出しています。Nullable整数を含む文字列に何も設定しない何も結果がありません。0

  • 私はNothingIntegerを設定した場合、予想通り、それはNothingになります。
  • Integer?String、すなわちNothingに設定すると、0になります。

もちろん、StringInteger?に明示的にキャストするかどうかにかかわらず、これを取得します。

私はこれをかなり簡単に回避できることを実感しましたが、私は何が欠けているか知りたいと思います。

Dim NullString As String = Nothing 
    Dim NullableInt As Integer? = CType(NullString, Integer?) 'Expected NullableInt to be Nothing, but it's 0! 
    NullableInt = Nothing 'This works, of course. NullableInt is Nothing. 

EDIT:/上執着ことで混乱しているように見えInteger?と皆に明示的な変換なしては、以前私がここに私のコードを持っていました。 Option Strict Onはこのタイプのものを捕まえるという提案がたくさんありました。しかし、これは実際にはヌル可能型よりも前の文字列から整数への変換ルールの奇妙なものですが、まだそれらに影響します。

+1

これらの種類のミスを早期に捕捉するには、[オプションを厳密にする]を使用します。 –

+0

なぜ文字列変数をNullable INTEgerに割り当てるのですか? Option Strictを有効にすることに同意する –

+0

Option Strictをオンにすると、Option Strictを1ファイルずつ有効にすることができます。これは、ファイルの作業中にエラーを処理する必要があります。 –

答えて

6

ここでVB.Net変換ルールと関係がある理由はここにあります。 StringタイプはInteger?と互換性がなく、したがって変換が行われます。中間ステップはStringからIntegerに変換しています。 VB.Net変換規則がこの同じ変換は、次いでIntegerを維持タイプInteger?Integer値0を変換するnullables

Dim local1 As String = Nothing 
Dim local2 As Integer = local1 ' It's 0 

なく再生することができるInteger値0にNothingまたは空Stringを変換します値。

+0

+1:うわー、私は真剣にこれのために自分の小さなコンバージョンを書く必要がありますか?それは弱いソースのようだ。 –

+0

@Brian MacKay:私は、空の文字列 '" "を値なしの' Nullable(Of Integer) 'として解釈することは非常に特殊なカスタムロジックであり、あなた自身の変換を記述する必要がありますあなたが望む行動(良いニュースは簡単だということです!)。ちょうど私の2セント。 –

+0

@ダンタオ:しかし、文字列はString.Emptyではない、それはNullです。 –

0

なぜ文字列を整数に割り当てようとしていますか?

Dim nullInt As Nullable(Of Integer) 'nullInt = Nothing as expected 

    'the following should NOT compile and won't with Option Strict On 

    nullInt = "" 
    nullInt = String.Empty 
関連する問題