私はC#を初めて使用し、最近、2つの異なるスコープ内で宣言されたC#のスコープオブジェクトがJavaと同じ名前を持つことができないことに気付きました。なぜこの設計上の制限が課せられるのですか?何か案は?たとえば、次のコードはC#では機能しません。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
private string Name = "";
public Program(string Name)
{
this.Name = Name;
}
public static void Main(string[] args)
{
bool flag = true;
if (flag)
{
Program p = new Program("");
return;
}
Program p = new Program("");
return;
}
}
}
参照pに関してクラスProgramの2番目のインスタンスが作成されるコードの24行目は、コンパイル時エラーを作成します。まったく同じコードがJavaで問題なく実行されますが、
public final class Test {
private String Name = "";
public Test (String Name) {
this.Name = Name;
}
public static void main(String[] args) {
boolean flag = true;
if (flag)
{
Test t = new Test("");
return;
}
Test t = new Test("");
return;
}
}
コンパイラクラスを思い出すと、ネストされた内部スコープ(ifループ内)の制御フローはその下のメインの部分から独立しているため、ユーザーが同じ変数名を使用できるようにしてもまったく害はありません。参照(Javaコンパイラによって行われる)。コンパイル時のエラーであってはなりません。では、このような設計上の制限があるC#には謎がありますか?