c# - 访问 `this` : invalid in C#, 的字段初始值设定项在 Java 中有效吗?

标签 c# java compiler-construction initialization

<分区>

首先介绍一下:

这段代码:

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

编译失败,出现以下错误:

A field initializer cannot reference the nonstatic field, method, or property `C.i'

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

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

A variable initializer for an instance field cannot reference the instance being created. Thus, it is a compile-time error to reference this in a variable initializer, as it is a compile-time error for a variable initializer to reference any instance member through a simple-name.

然而,这在 Java 中工作得很好:

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

还在我身边吗?好的,这是问题。错误,问题。

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

最佳答案

简而言之,在构造函数主体运行之前访问接收器的能力是边际 yield 的一个特性,它使得编写有缺陷的程序变得更加容易。因此,C# 语言设计者完全禁用了它。如果您需要使用接收器,则将该逻辑放在构造函数主体中。

至于为什么该功能在 Java 中是合法的,您将不得不询问 Java 设计人员。

关于c# - 访问 `this` : invalid in C#, 的字段初始值设定项在 Java 中有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17342367/

相关文章:

c# - 使用表存储的 Azure 成员(member)资格提供商

c# - 如何在构建后自动执行重复性任务?

c# - REST Web 服务 Web API - 基于多个实体创建端点

java - 为什么 float 用 1 除以 2 或 4 时返回 0?

java - 为什么 HATEOAS 在使用 Swagger 2.x 启动期间开始为 spring-boot 版本 >= 2.2.x 创建问题?

compiler-construction - 如何处理多个溢出值作为单个指令的操作数?

c# - 如何从 C# 调用 AllocateAndInitializeSid 函数?

Java将Observable列表中的列分配给@fxml列

compiler-construction - 编写编译器的好语言

java - 可变长度参数可以替代一维数组吗?