是否可以在同一个范围内,在c#中多次声明相同名称的变量?

是否可以在同一个范围内,在c#中多次声明相同名称的变量?,c#,.net,visual-studio,C#,.net,Visual Studio,结果: 一, 我声明了两次I变量。为什么c#编译器允许我这样做 若我将尝试在同一范围内声明,那个么编译器将给我异常,那个么为什么允许在嵌套范围内声明呢?这不是一个bug 类声明中的字段int i可以随时使用this.i访问,因此没有重叠。事实上,在camelCase中,这实际上是在方法中写入(私有)字段名、参数和局部变量的约定。另一方面,属性、方法名、类名等都是用PascalCase编写的 因此,在您的类中,如果您想访问类的字段i,可以通过编写this.i来实现。否则,只要您在if-块中,您就可

结果:

一,

我声明了两次
I
变量。为什么c#编译器允许我这样做


若我将尝试在同一范围内声明,那个么编译器将给我异常,那个么为什么允许在嵌套范围内声明呢?

这不是一个bug

类声明中的字段
int i
可以随时使用
this.i
访问,因此没有重叠。事实上,在camelCase中,这实际上是在方法中写入(私有)字段名、参数和局部变量的约定。另一方面,属性、方法名、类名等都是用PascalCase编写的

因此,在您的类中,如果您想访问类的字段
i
,可以通过编写
this.i
来实现。否则,只要您在
if
-块中,您就可以访问范围指定变量
i

namespace project1
{
    public class testclass
    {
        int i = 0;

        public int foobar()
        {
            int i = 1;
            return i;
        }
    }
}

请参阅以获取更多参考。

这不是一个bug

类声明中的字段
int i
可以随时使用
this.i
访问,因此没有重叠。事实上,在camelCase中,这实际上是在方法中写入(私有)字段名、参数和局部变量的约定。另一方面,属性、方法名、类名等都是用PascalCase编写的

因此,在您的类中,如果您想访问类的字段
i
,可以通过编写
this.i
来实现。否则,只要您在
if
-块中,您就可以访问范围指定变量
i

namespace project1
{
    public class testclass
    {
        int i = 0;

        public int foobar()
        {
            int i = 1;
            return i;
        }
    }
}

有关更多参考,请参阅。

在特定范围内声明的所有变量都必须是唯一的

您可以根据某些变量的数据类型重用它们,但是否应该重用变量取决于您正在做什么

您的代码可以工作,但您再次声明
i
,这是不正确的,因为它已经存在,值为0

您需要更改其值,而不是尝试重新创建变量:

namespace Project1 // PascalCase here for namespace name
{
    public class TestClass // Again PascalCase for class name.
    {
        int i = 0; // camelCase correct here for field name.

        public void Foobar() // PascalCase for method name.
        {
            if (0 == 0)
            {
                int i = 0; // camelCase correct here for local variable name. 
                           // Cannot be re-declared until your if-block is finished.

                // accessing both elements named 'i'
                this.i = i;
            }

        return;
        }
    }
}
namespace project1
{
    public class testclass
    {
        int i = 0;

        public void foobar()
        {
            if (0 == 0)
            {
                i = 0;
            }

            return;
        }
    }
}
您还可以创建一个新变量:

namespace Project1 // PascalCase here for namespace name
{
    public class TestClass // Again PascalCase for class name.
    {
        int i = 0; // camelCase correct here for field name.

        public void Foobar() // PascalCase for method name.
        {
            if (0 == 0)
            {
                int i = 0; // camelCase correct here for local variable name. 
                           // Cannot be re-declared until your if-block is finished.

                // accessing both elements named 'i'
                this.i = i;
            }

        return;
        }
    }
}
namespace project1
{
    public class testclass
    {
        int i = 0;

        public void foobar()
        {
            if (0 == 0)
            {
                i = 0;
            }

            return;
        }
    }
}

在特定范围内声明的所有变量都必须是唯一的

您可以根据某些变量的数据类型重用它们,但是否应该重用变量取决于您正在做什么

您的代码可以工作,但您再次声明
i
,这是不正确的,因为它已经存在,值为0

您需要更改其值,而不是尝试重新创建变量:

namespace Project1 // PascalCase here for namespace name
{
    public class TestClass // Again PascalCase for class name.
    {
        int i = 0; // camelCase correct here for field name.

        public void Foobar() // PascalCase for method name.
        {
            if (0 == 0)
            {
                int i = 0; // camelCase correct here for local variable name. 
                           // Cannot be re-declared until your if-block is finished.

                // accessing both elements named 'i'
                this.i = i;
            }

        return;
        }
    }
}
namespace project1
{
    public class testclass
    {
        int i = 0;

        public void foobar()
        {
            if (0 == 0)
            {
                i = 0;
            }

            return;
        }
    }
}
您还可以创建一个新变量:

namespace Project1 // PascalCase here for namespace name
{
    public class TestClass // Again PascalCase for class name.
    {
        int i = 0; // camelCase correct here for field name.

        public void Foobar() // PascalCase for method name.
        {
            if (0 == 0)
            {
                int i = 0; // camelCase correct here for local variable name. 
                           // Cannot be re-declared until your if-block is finished.

                // accessing both elements named 'i'
                this.i = i;
            }

        return;
        }
    }
}
namespace project1
{
    public class testclass
    {
        int i = 0;

        public void foobar()
        {
            if (0 == 0)
            {
                i = 0;
            }

            return;
        }
    }
}

这不是C#的错误。阅读有关局部变量和作用域的内容您认为这会给您带来什么错误?请在前面的注释上展开-
如果
有自己的作用域(也可以访问封闭的作用域)。这是许多编程语言都不具备的特性have@UnholySheep这与方法中的变量有关,而与
if
中的变量有关。如果您声明
inti
在方法的开头,如果,则不能在
中再次声明它。这不是C#的错误。阅读有关局部变量和作用域的内容您认为这会给您带来什么错误?请在前面的注释上展开-
如果
有自己的作用域(也可以访问封闭的作用域)。这是许多编程语言都不具备的特性have@UnholySheep这与方法中的变量有关,而与
if
中的变量有关。如果您声明
inti
如果
.OP未重新创建任何变量,则无法在方法开头的
中再次声明它。在
foobar
方法中,创建了另一个局部变量。这是完全合法的。我同意米沙的观点,当你说这是不正确的时候,这是错误的。@米沙如果我错了,那么让你自己不仅对我有用,而且对其他看到这个答案并纠正我的人也有用。OP出现问题的原因是,他试图在
if
语句中声明一个名为
i
的新整数,但他也将
i
声明为全局字段,因此
i
已经存在,而没有在if语句中再次声明。看。。。OP在编译代码时没有问题…'因为这是完全合法的。他的问题是“为什么它是合法的”而不是“为什么我不能这样做”。所以你已经误解了这个问题。。。为了解释为什么你们错了,我要指出OP并没有重新创建任何变量。在
foobar
方法中,创建了另一个局部变量。这是完全合法的。我同意米沙的观点,当你说这是不正确的时候,这是错误的。@米沙如果我错了,那么让你自己不仅对我有用,而且对其他看到这个答案并纠正我的人也有用。OP出现问题的原因是,他试图在
if
语句中声明一个名为
i
的新整数,但他也将
i
声明为全局字段,因此
i
已经存在,而没有在if语句中再次声明。看。。。OP在编译代码时没有问题…'因为这是完全合法的。他的问题是“为什么它是合法的”而不是“为什么我不能这样做”。所以你已经误解了这个问题。。。作为你错的原因的解释,我只给你指出