我已经开始学习c#了。我试图声明一个类和一些变量,并尝试做一个简单的字符串连接。但我收到一些错误 - 代码在下面
namespace ConsoleApplication1
{
class Class1
{
string s1 = "hi";
string s2 = "hi";
string s3 = s1 + s2;
}
}
我得到的错误是 - 字段初始值设定项无法引用非静态字段,方法,属性'ConsoleApplication1.Class1.s1
有人可以解释这里发生的事情。
感谢。
答案 0 :(得分:15)
有人可以解释这里发生的事情。
好吧,编译器错误消息说明了这一切,真的,一旦你超越了术语。这一行无效:
string s3 = s1 + s2;
您正在声明实例变量,并且不允许实例变量初始值设定项(此处为s1 + s2
)引用正在创建的实例中的其他字段 - 或实际上是实例本身。请记住,上述声明等同于:
string s3 = this.s1 + this.s2;
来自C#4规范的第10.5.5.2节:
实例字段的变量初始值设定项无法引用正在创建的实例。因此,在变量初始化程序中引用
this
是编译时错误,因为变量初始化程序通过简单名称引用任何实例成员是编译时错误。
(不可否认,这是规范中措辞更为奇怪的一点......)
您必须将逻辑放入构造函数体中:
class Class1
{
string s1 = "hi";
string s2 = "hi";
string s3;
public Class1()
{
s3 = s1 + s2;
}
}
答案 1 :(得分:8)
变量不按特定顺序[逻辑]初始化。最好设计您的程序,使它们无论变量初始化的顺序如何都可以工作。
对于局部变量的非平凡分配,您使用该类型的构造函数:
class Class1
{
string s1 = "hi";
string s2 = "hi";
string s3;
public Class1()
{
s3 = s1 + s2;
}
}
答案 2 :(得分:6)
尝试在方法中初始化s3
,最好是构造函数
class Class1
{
string s1 = "hi";
string s2 = "hi";
string s3;
public Class1()
{
s3 = s1 + s2;
}
}