gpt4 book ai didi

c# - 为什么 C# 不允许使用非静态字段的字段初始值设定项?

转载 作者:IT王子 更新时间:2023-10-29 04:34:29 26 4
gpt4 key购买 nike

为什么 C# 允许这样做:

public class MyClass
{
static int A=1;
static int B=A+1;
}

但是不允许(“字段初始值设定项不能引用非静态字段、方法或属性”)这个

public class MyClass
{
int A=1;
int B=A+1;
}

我认为这是保证(使用静态字段)按顺序初始化的顺序,但它也适用于此处,如您所见:

public class MyClass
{
int A=((Func<int>)(delegate(){ Console.WriteLine ("A"); return 1;}))();
int B=((Func<int>)(delegate(){ Console.WriteLine ("B"); return 2;}))();
int C=((Func<int>)(delegate(){ Console.WriteLine ("C"); return 3;}))();
}

void Main()
{
var a = new MyClass();
}

结果:

A
B
C

问题

我对限制的原因/逻辑更感兴趣。只是出于好奇。

nb 没有找到任何重复项。

最佳答案

I'm more interested with the reason/logic for why it was restricted. just for curiosity.

如果您阅读 C# 语言规范 10.11.3,它会提示此处的基本原理。在讨论变量初始值设定项时:

It is useful to think of instance variable initializers and constructor initializers as statements that are automatically inserted before the constructor-body.

由于这些是“插入到构造函数之前”,它们在 this 有效之前执行,因此允许您引用其他成员(有效地 this)会有问题。

请注意,这也与 static 字段的工作方式一致。在这两种情况下,您都可以访问静态数据,但不能访问实例数据。您收到的错误消息(“字段初始值设定项无法引用非静态字段、方法或属性”)直接说明了这一点。

关于c# - 为什么 C# 不允许使用非静态字段的字段初始值设定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27725571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com