読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

1 と null の比較

C#

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 だとコンパイルエラーになりました。
まぁ、当然と云えば当然か。。。

余談

全く関係ないけど、なんで C# コンパイラのバージョンって 3.5 で付与形態が変わったんだろうか。。。