1 と null の比較
Twitter で「 C# で『 1 == null 』と云う比較演算を書くと、 warning は出るけどコンパイル可能。なんでだろう?」と云う話を見かけました。
これは、「 1 が null 許容型に暗黙的にキャスト可能」なのでコンパイルが通る、のだと思うのですが、 null 許容型のない .NET 1.1 の頃はどうだったの? と云う疑問が沸いたので、調べてみました。
class Foo { static void Main() { if (1 == null) System.Console.WriteLine("Hoge"); } }
こんなコードを各バージョンの C# コンパイラにかけてみます。
( .NET 3.5 と 2.0 では「 warning CS0162: 到達できないコードが検出されました」も出ますが、下記の出力結果上は省略しました)
.NET Framework version 3.5 (Visual C# 2008 Compiler version 3.5.30729.1)
warning CS0472: 型 'int' の値が型 '<null>' の 'null' に等しくなることはないので、式の結果は常に 'false' になります。
文章の意味がよく理解出来ないところがあります(和訳の問題?)が、要は「 1 は null じゃないからこの条件式は false にしかならないよ!」と警告されているわけですね。
構文上の問題はない、と。
.NET Framework version 2.0.50727 (Visual C# 2005 Compiler version 8.00.50727.3053)
warning CS0472: 型 'int' の値が型 'int?' の 'null' に等しくなることはないので、式の結果は常に 'false' になります。
言っている事は .NET 3.5 と一緒ですが、こっちの方が少し判りやすい気がするw
.NET Framework version 1.1.4322 (Visual C# .NET Compiler version 7.10.6001.4)
error CS0019: 演算子 '==' を 'int' と '<null>' 型のオペランドに適用することはできません。
.NET 1.1 だとコンパイルエラーになりました。
まぁ、当然と云えば当然か。。。