为什么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);
}
答案 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;
}
}
也许我误解了你想要做的事情,但希望这会为你解决问题。