VB vs C#: なぜこれが可能なのか? 質問する

VB vs C#: なぜこれが可能なのか? 質問する

ここに、考えるたびに悩まされるコードがあります。

Option Strict On

Module Module1

    Sub Main()
        For Each i As Integer In New String() {"why", "is", "this", "tolerated?"}
            ' compiles just fine.
        Next
    End Sub

End Module

C# では、文字列を暗黙的に整数に変換することは許可されません。

class Program {
    static void Main(string[] args) {
        foreach (int i in new string[] {"that's", "better"}) {
            // will not compile, and for good reason.
        }
    }
}

なぜ VB ではそれができるのでしょうか? 私はまだ比較的初心者なので、これを楽しもうとしていますが、純粋に好奇心もあります。きっと答えを知っている開発者がいるはずです。

ベストアンサー1

それは、For Eachステートメント。ドキュメントによれば、実行時に評価されます。

リンクより:

Option Strict が On に設定されている場合、縮小変換によって通常はコンパイラ エラーが発生します。ただし、For Each ステートメントでは、グループ内の要素から要素への変換は実行時に評価および実行されるため、縮小変換によって発生するコンパイラ エラーは抑制されます。

次の例では、Option Strict がオンの場合、n の初期値として m を割り当てると、Long から Integer への変換が縮小変換であるため、コンパイルされません。ただし、For Each ステートメントでは、number への割り当てに Long から Integer への同じ変換が必要であるにもかかわらず、コンパイラ エラーは報告されません。大きな数値を含む For Each ステートメントでは、ToInteger を大きな数値に適用すると実行時エラーが発生します。

おすすめ記事