重载 C# 变量

本文关键字:变量 重载 | 更新日期: 2023-09-27 18:32:32

我对 C# 有点陌生,我已经取得了一些让我感到困惑的地方,为什么允许这样做。

public interface IBase
{
}
public interface ISub : IBase
{
}
public class Thing
{
    protected IBase provider;
    public Thing(IBase provider)
    {
        this.provider = provider;
    }
}
public class AnotherThing : Thing
{
    protected ISub provider;
    public AnotherThing(ISub provider) : base(provider)
    {
        this.provider = provider;
    }
}

我希望我只是密集,但我不明白如何允许我覆盖provider而不会对编译器造成一些混乱。

代码确实有效。

重载 C# 变量

我很

惊讶你也没有收到任何警告。

您正在做的是通过在派生类中为受保护成员提供新声明来隐藏受保护成员provider。这是允许的,但您应该使用 new 关键字装饰声明,以更明确地表明您打算隐藏成员,而不仅仅是意外/疏忽。

你问第二种情况,我假设:你不会覆盖任何东西,你只是声明一个新的受保护变量并用this显式引用它:

this.provider = provider;

由于提供程序参数的类型与this.provider类型相同ISub,编译器知道您确切的变量。

您应该

会收到一条警告,指示AnotherThing中的provider隐藏了继承的成员。

实际上,编译器在AnotherThing上下文中忽略Thing中的provider - 这称为名称隐藏。