【问题标题】:Constructor initializer does not allow me to use 'this'构造函数初始化器不允许我使用“this”
【发布时间】:2009-04-29 13:13:12
【问题描述】:

编译器错误 关键字“this”在当前上下文中不可用

delegate void CallBack(int i);
class A
{
    public A(CallBack cb) { }
}
class B : A
{        
    public B() : base(new CallBack(this.f)){}

    private void f(int i) { }
}

为什么会出现这个错误? 作为一种解决方案,我想在 A() 中提供一个无参数受保护的 ctor 并拥有

class B : A
{
     public B() : base()   // inherit the new A() ctor
     {
          base.cb = new CallBack(this.f); //this is allowed here
     }
     //...
}

【问题讨论】:

    标签: c# inheritance constructor


    【解决方案1】:

    这是因为“this”在基类构造函数运行之前还没有被创建。 在您的第二个示例中,基本构造函数已经完成,现在“this”有了意义。

    【讨论】:

      【解决方案2】:

      在第一个示例中,B 实例尚未初始化。第二个是。

      【讨论】:

        【解决方案3】:

        由于对象尚未(完全)构造,即基础构造函数尚未运行,this 在那里不可用。

        【讨论】:

          【解决方案4】:

          您应该使用抽象/虚拟方法。

          abstract class A {
              A() {
                  this.Initialize();
              }
          
              abstract void Initialize() { }
          }
          
          class B : A {
              string Text;
          
              B() { }
          
              override void Initialize() {
                  this.Text = "Hello world";
              }
          }
          

          【讨论】:

          • 您实际上是在建议从构造函数调用虚方法??
          • 这可能是一个很好的模式,但是“文本”应该在 A 中,因为正如您在我的 pb 中看到的那样,A 也初始化回调,而且我给出的解决方案也只使用 ctors (没有初始化程序,所以不会让用户感到困惑)。但是thx 4解决方案。
          • @Greg:是的,这是一种可能的解决方案。 @cataounfeldeszuzieq:“文本”可以在 A 或 B 中,这并不重要。源代码只是其中一种可能情况的示例。 @unknown:请告诉我,为什么我得了负面评价。这对我和其他人都会有用。谢谢。
          猜你喜欢
          • 2014-04-05
          • 2023-03-08
          • 2018-06-30
          • 2013-11-17
          • 1970-01-01
          • 1970-01-01
          • 2020-08-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多