2

重複の可能性: 関数に戻り値がない場合、VB.NET で警告が表示されない

次の関数を書いているときに、すべてのコード パスで値を返さないという警告が表示されないことに気付きました。このCASE ELSE句は値を返さないため、警告が表示されるはずです。通知レベルを警告からエラーに変更してみましたが、それでも文句はありません。

Public Function LookupOccasionGroup(ByVal occasion As GCOccasionType) As GCOccasionGroups

    Dim occasionInfo = _occasionTypes.FindByOccasionTypeID(occasion)
    If occasionInfo Is Nothing Then
        Throw New InvalidOperationException("blah blah")
    End If

    Select Case occasionInfo.OccasionGroupID

        Case GCOccasionGroups.DineIn, GCOccasionGroups.Delivery, GCOccasionGroups.CarryOut
            Return CType(occasionInfo.OccasionGroupID, GCOccasionGroups)

        Case Else
            Log.Warn("Blah Blah.")
    End Select

End Function

ここに画像の説明を入力してください

4

2 に答える 2

1

VB.NET を別の言語と混同しています。VB.NET では、戻り値を割り当てないことが許可されています。戻り値は Nothing で、C# の default(T) と同じです。これは、Visual Basic では常に許可されています。

スクリーンショットは、関数の戻り値の型を宣言するのを忘れたときに得られる別の診断を示しています。コンパイラは、代入が行われない場合に何を返すかを確実に判断できなくなりました。Object をパントし、代入が行われなかった場合は Nothing を返します。それは、真の問題がどこにあるのかほとんどヒントを残さない場所にスローされる、不可解な NRE 例外で爆発する可能性が非常に高いです。

Function Foo()
End Function

あなたは今得ます:

error BC42021: Function without an 'As' clause; return type of Object assumed.
error BC31072: Warning treated as error : Function without an 'As' clause; return type of Object assumed.
error BC42105: Function 'foo' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.

最初の 2 つのエラーは、同じリストの「暗黙の型; オブジェクトを想定」条件によって生成されます。3番目のエラーはあなたが探しているもので、警告は変更によってエラーになりました。もちろん、実際にはこれを使用したくありません。

于 2012-10-04T18:16:50.420 に答える
0

列挙型のすべての可能な値が最初のケースに含まれていますか? もしそうなら、他の人が決して打たれることはないと信じるのに十分な知性がそこにあると考えられます.

これをテストするには、列挙型に新しい値を追加するか、最初のケースから可能な値の 1 つを削除します。

于 2012-10-04T16:55:19.153 に答える