【问题标题】:why delegate must be static?为什么委托必须是静态的?
【发布时间】:2012-04-11 20:46:19
【问题描述】:

在下面的代码中我必须声明方法 MdrResponseInterpreter static 否则我有编译错误。

class.... {

    private StandardBuilder _mdrResponseBuilder = 
      new StandardBuilder(MdrResponseInterpreter);

    public static bool MdrResponseInterpreter(DNMessageDeliverer builder, 
                                              DNFieldSet message)
    {
        // .... work
    }

为什么?由于_mdrResponseBuilder 不是静态的,我希望MdrResponseInterpreter 应该能够访问this

【问题讨论】:

    标签: c# delegates initializer method-group


    【解决方案1】:

    因为字段初始化器无权访问 this / 实例成员。如果要访问实例成员,请将初始化移至构造函数。

    规范说:

    实例字段的变量初始化器不能引用正在创建的实例。因此,在变量初始化器中引用 this 是编译时错误

    虽然您的代码没有显式引用 this,但如果方法是实例成员,则委托转换的方法组确实会隐式引用 this

    【讨论】:

      【解决方案2】:

      要添加到 CodeInChaos 的答案(这是正确的),您可以将分配移至构造函数:

      private StandartBuilder _mdrResponsBuilder;
      
      public Foo() // Whatever your type is called
      {
          // Simpler syntax for creating a delegate, too. Just use a
          // method group conversion...
          _mdrResponsBuilder = MdrResponseInterpreter;
      }
      

      编辑:以上假设StandartBuilder 是委托类型。如果它是具有构造函数的类型接受委托类型,那么您需要返回到new StandartBuilder(MdrResponseInterpreter),但仍然在构造函数中。

      【讨论】:

      • 只是想知道,“_mdrResponsBuilder = MdrResponseInterpreter”是如何正确的?问题中没有任何内容表明 StandardBuilder 是一个委托......它可能是一个在其构造函数中接受 Func 的类?顺便说一句,我没有投反对票
      • @odalet:是的,这是可能的。我认为它更有可能(给定问题标题)它是委托类型。将编辑澄清。
      【解决方案3】:

      该方法必须是静态的,因为它在对象初始化时调用,在构造函数开始执行之前。如果要访问this,请从构造函数内部调用初始化方法。

      【讨论】:

        【解决方案4】:

        你不能在初始化器中使用实例成员。

        将委托视为具有 1) 对象引用和 2) 方法引用。由于无法访问this,因此无法设置对象引用,所以唯一能将方法用作委托的方法是将其声明为static(因为委托的对象引用是null对于静态方法)。将初始化移动到构造函数可以帮助您解决这个问题。

        【讨论】:

        • 当时肯定有一个对象(否则赋值的值在哪里?)但是你还不能访问this
        • 我还是会说不清楚。对象确实完全存在。它可能还没有完全初始化,但在构造函数体中也是如此。 (可能还有其他派生的构造函数体也尚未运行......)
        猜你喜欢
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多