9

VB.NET でC#のキーワードの同等性を調査したところ、この質問に出会いました。default

それから私は興味を持った。0いくつかの背景 - 多くの列が null になる可能性がある Excel スプレッドシートの解析に取り組んでおり、整数列の beingと beingの間には確かに違いがありますnull

私は少し解析メソッドを書きました:

Function Test(ByVal i As String) As Nullable(Of Integer)
    Dim j As Integer

    If Integer.TryParse(i, j) Then
        Return j
    Else
        Return Nothing
    End If
End Function

これは正しく動作するようです。しかし、ここでは、必要にInteger応じて返すことができます:

Function Test(ByVal i As String) As Nullable(Of Integer)
    Return 2 'or Return Nothing
End Function

私もできるC#

 static void Main(string[] args)
 {
     int? j = Test("1");
 }

 public static int? Test(string i)
 {
     return 2; //or return null
 }

上記のコードを に変更jするとint、コンパイル時の変換エラーが発生しますが、これは完全に理にかなっています。

今、私の質問 - VB で、同様のアプローチを試みた場合:

Sub Main()
    Dim j As Integer = Test("hello")
End Sub

Function Test(ByVal i As String) As Nullable(Of Integer)
    Dim j As Integer
    Return If(Integer.TryParse(i, j), j, Nothing)
End Function

iまたは、ではない私のテストケースでは、次のIntegerように書き換えることができます。

Function Test(ByVal i As String) As Nullable(Of Integer)
    Return DirectCast(Nothing, Integer)
End Function

VB.NET で動作する方法のためNothing、このコードはエラーなしでコンパイルおよび実行されます。j は Integer のデフォルト 0 に設定されます

これは私にはとても汚いと感じます。このシナリオでは、警告やエラーなしでメソッドの意図をいくらか変更できます。これはVBでの動作の意図しない副産物Nothingですか、それとも意図された目的ですか?

4

2 に答える 2

4

実行時に変数の型を変更できる遅延バインディングを使用しているため、VB.Net コードはコンパイルされます。

コードを でコンパイルするとOPTION STRICT ON、次のようなコンパイラ エラーが発生します。

Option Strict On は、'Integer?' からの暗黙的な変換を許可しません。「整数」に。

于 2015-05-27T14:55:52.560 に答える
2

NULLデフォルト値でその型をインスタンス化するVB.Netの値型に割り当てることはできません。あなたの場合、NULL整数を作成するのではなく、デフォルト値の 0 を保持する整数を作成します。

別の良いメモ: ターンOption Strict On

于 2015-05-27T14:56:10.237 に答える