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

プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

VB.NETでは、Returnの後の実行されない処理書いても、コンパイルエラーにならない。

VB.NETの場合

ソース
Imports System

Class Test
	Public Shared Sub Main
		Hoge()
	End Sub

	Public Shared Function Hoge As Integer
		Return 0
		Console.WriteLine("abc")
	End Function
End Class
コンパイル結果
>vbc Test.vb
Microsoft (R) Visual Basic Compiler Version 9.0.30729.1
Copyright (C) Microsoft Corporation. All rights reserved.


>

※到達不可能なコードがあるにも関わらず、コンパイルエラーが起きない。

一方Javaの場合

ソース
public class Test {
	public static void main(String[] args) {
		Hoge();
	}

	public static int Hoge() {
		return 0;
		System.out.println("abc");
	}
}
コンパイル結果
>javac -version
javac 1.6.0_07

>javac Test.java
Test.java:8: この文に制御が移ることはありません。
                System.out.println("abc");
                ^
Test.java:9: return 文が指定されていません。
        }
        ^
エラー 2 個

>

rubyの場合

ソース
class Test
	def Hoge
		return 0;
		puts("abc");
	end
end

Test.new.Hoge();
実行結果
taka@ubuntu-vm:~$ ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]
taka@ubuntu-vm:~$ ruby -c test.rb
Syntax OK
taka@ubuntu-vm:~$ ruby test.rb
taka@ubuntu-vm:~$ 

エラーが出ず。

JavaScriptの場合

ソース
<script>
function Hoge() {
	return 0;
	alert("abc");
}

Hoge();
</script>
実行結果 on Chrome 13.0.782.24 dev-m

エラーが出ず。

結論

.NETはJavaのパクリなので、動きが違うと違和感ありますね。
警告でも出しといてくれれば、安心だけど、
まあ、そんなショボいミスは普通はしないかな。