字段初始化程序访问“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设计人员。

在C#中,基本构造函数调用中的一种用法如何解决多个枚举警告? - c#

以下代码向我警告了IEnumerable可能的多个枚举:public ClassName(IEnumerable<OtherClassName> models) : base(models) { _models.AddRange(models); } 由于“基本”调用,消除此警告的常规解决方案不起作用。我无法转换为列表,因为没有地方可以存储该列表…

在C++之后学习C# - c#

随着语言的发展,我一直在学习C和C++。现在,我想学习C#。我知道它们之间有一些巨大的差异-例如删除指针和垃圾回收。但是,我不知道两者之间的许多差异。C++程序员在转移到C#时需要知道的主要区别是什么? (例如,我可以使用什么代替STL,它们之间的语法差异或任何其他可能被认为重要的东西。) 参考方案 C# for C++ Developers是一个不错的起点…

在C#中调用C++库 - c#

Improve this question 我有很多用C++编写的库。我想从C#中调用这些库,但是遇到了很多问题。我想知道是否有一本书或指南可以告诉我如何做。 参考方案 DllImport-http://msdn.microsoft.com/en-us/library/aa984739(VS.71).aspx 包装器类-http://social.msdn.…

在C++代码中使用C#dll - c#

我需要整合这个C# dll在我的C++代码中。我想从dll中调用用C#编写的某些函数,而其余代码则用C++编写。最简单,最快的方法是什么?该程序仅在Windows上执行。 参考方案 从非托管代码调用.NET DLL基本上有两种情况: .NET DLL公开一个COM接口。在这种情况下,您可以从C++代码中使用COM。 .NET DLL不公开COM接口。在这种情…

在C#中绘制二次方程曲线 - c#

我对c#System Draw非常陌生,因此请帮助我编写代码。我正在尝试绘制二次方程曲线,并使用“ for”循环来为曲线绘制10个坐标。我已经多次测试过此代码,并且在启动代码时一无所有。另外,每当我运行代码时,都会收到消息ArgumentException未处理,参数对于代码“ g.DrawCurve(aPen,Points);”无效。突出显示。请帮助我解决…