C#编译器忽略构造函数中的重复参数名称

时间:2011-02-18 00:02:52

标签: c# oop

我不确定为什么会这样 - 希望有人能解释一下!

我有一个名为BaseRequest的基类,其中包含:

protected int cartNumber;

我有一个派生类,它继承了BaseRequest。它有一个公共字段和构造函数如下:

public int currentCartNumber;

public ExtendedBaseRequest(int cartNumber)
{
   currentCartNumber = cartNumber;
}

是的,我知道在基类中有一个与受保护字段同名的参数有点傻,但直到现在我才注意到它!

这会编译并运行,但派生类中的public currentCartNumber值未设置,因为它使用基类中的值,初始化时始终为零。

编译器是否应该对此抱怨,因为构造函数签名中的cartNumber声明与基础中的声明具有相同的名称?

期待您的回音。

3 个答案:

答案 0 :(得分:7)

  

这会编译并运行,但派生类中的public currentCartNumber值未设置,因为它使用基类中的值,初始化时始终为零。

该描述与您提供的代码片段不匹配。请提供一个完整的简短程序,我们可以自行编译并运行以重现所谓的行为。

  

编译器是否应该对此抱怨,因为构造函数签名中的cartNumber声明与基础中的声明具有相同的名称?

不,这完全合法。在同一声明空间中声明两次相同的名称是违法的,但基类和形式参数列表具有不同的声明空间。

我们希望这样做是合法的:

class C
{
    int blah;
    public C(int blah) 
    {
        this.blah = blah;
    }
}

答案 1 :(得分:3)

您对正在发生的事情的分析是不正确的。这里还有别的东西。

您确定没有将0传递给构造函数吗?

不合格的cartNumber将始终引用该参数。继承的字段需要使用thisbase

进行限定

在问题中显示的代码中,语句currentCartNumber = cartNumber会将cartNumber 参数的值分配给currentCartNumber 字段

答案 2 :(得分:-1)

我会说你无法解决这个问题,你可以使用它来强制使用本地成员,但你无法指定你想要使用该参数。

使用类似m_或我的前缀的smth重命名本地受保护成员,或者更改参数名称。

见这里:

How do you name constructor argument and member variables?