3

重複の可能性:
ネストされたローカルスコープで重複する変数名を宣言できないのはなぜですか?

私は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#には謎がありますか?

4

0 に答える 0