字段初始化程序访问“this”:在C#中无效,在Java中有效? - c#

Improve this question

一,简介:

这段代码:

class C
{
    int i = 5;
    byte[] s = new byte[i];
}

无法编译,并出现以下错误:

字段初始值设定项不能引用非静态字段,方法或属性“C.i”

Resharper说类似的话:无法在静态上下文中访问非静态字段i

这与C# spec says一致-字段初始值设定项无法访问当前正在创建的实例(this),或者不能扩展为任何实例字段:

实例字段的变量初始值设定项无法引用
创建实例。因此,要参考的是编译时错误
这在变量初始值设定项中,因为这是
变量初始值设定项可通过
简单名称。

但是,这在Java中效果很好:

class C {
    int i = 5;
    byte s[] = new byte[i]; //no errors here
}

还在我这儿?好,这是问题。嗯,问题。

在一个可以在C#中有效的假设世界中,我想知道:甚至可以成为吗?如果是这样,它将添加到表中的优点和缺点是什么?
另外,由于Java确实支持它,因此Java的
是否具有相同的优点/缺点?还是类型初始值设定项在两种语言中的工作方式之间存在基本差异

参考方案

简而言之,能够在构造函数主体运行之前访问接收器的功能是一项边际收益的功​​能,它使编写有缺陷的程序更加容易。因此,C#语言设计人员完全禁用了它。如果需要使用接收器,则将该逻辑放入构造函数主体中。

至于为什么该功能在Java中是合法的,则必须询问Java设计人员。

45码