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
ですか、それとも意図された目的ですか?