用“this”链接的构造函数

时间:2009-03-25 12:42:31

标签: c# c#-3.0

为什么ClassA中的第一个构造函数会导致编译器错误“无法使用”这个“在成员初个化程序中”?

......或者我怎样才能让它发挥作用?

由于

public sealed class ClassA : IMethodA
{
    private readonly IMethodA _methodA;

    public ClassA():this(this)
    {}

    public ClassA(IMethodA methodA)
    {
        _methodA = methodA;
    }

    public void Run(int i)
    {
        _methodA.MethodA(i);
    }

    public void MethodA(int i)
    {
        Console.WriteLine(i.ToString());
    }
}

public interface IMethodA
{
    void MethodA(int i);
}

4 个答案:

答案 0 :(得分:9)

您可以使用this(...)语法在同一级别调用另一个构造函数 - 但是,您不能在此上下文中使用this(当前实例)。

这里最简单的选择是复制分配代码(_methodA = methodA)。

另一个选项可能是null-coalescing:

public ClassA():this(null)
{}

public ClassA(IMethodA methodA) 
{ // defaults to "this" if null
    _methodA = methodA ?? this;
}

答案 1 :(得分:3)

这在C#规范

的第10.11.1节中提到
  

实例构造函数初始值设定项   无法访问实例   创建。因此它是一个   编译时错误引用此   在一个参数表达式中   构造函数初始化程序,就像它一样   参数的编译时错误   表达式引用任何实例   会员通过一个简单的名字。

没有办法让它与实例构造函数一起使用,因为无法访问它。你可以做的是使构造函数私有,创建一个初始化方法和一个静态构造函数。

public sealed class ClassA : IMethodA {    
  private ClassA() { }
  private void Initialize(IMethodA param) { ... }
  public static ClassA Create() {
    var v1 = new ClassA();
    v1.Initialize(v1);
    return v1;
  }
  public static ClassA Create(IMethodA param) {
    var v1 = new ClassA();
    v1.Initialize(param);
    return v1;
  }
}

答案 2 :(得分:3)

您正在尝试在构造对象之前传递该对象。虽然在这种情况下编译器可以做一些合理的事情,但一般来说这是行不通的。

如果你这样做,你的实际例子是有效的:

   public ClassA()
  {
    _methodA = this; 
  }

但是你可能想要分享更多的逻辑,所以只需使用一个函数。

  public ClassA()
  {
    SetStuff(); 
    _methodA = this; 
  }

  public ClassA(IMethodA methodA)
  {
    SetStuff(); 
    _methodA = methodA;
  }

答案 3 :(得分:1)

在链接构造函数时,不能使用this关键字,因为this指的是尚未实例化的对象(对象的创建直到某些(顶部才开始) -level或base)构造函数块已经输入)。而且,为什么你想要这样做呢?如果您可以随处访问this关键字,那似乎毫无意义。

我建议只使用独立的构造函数:

public sealed class ClassA : IMethodA
{
    private readonly IMethodA _methodA;

    public ClassA()
    {
        _methodA = this;
    }

    public ClassA(IMethodA methodA)
    {
        _methodA = methodA;
    }
}

也许我误解了你想要做的事情,但希望这会为你解决问题。