需要一些初学者C#代码的解释

时间:2013-04-24 20:02:47

标签: c#

我已经开始学习c#了。我试图声明一个类和一些变量,并尝试做一个简单的字符串连接。但我收到一些错误 - 代码在下面

namespace ConsoleApplication1
{
    class Class1
    {
        string s1 = "hi";
        string s2 = "hi";
        string s3 = s1 + s2;
    }
}

我得到的错误是 - 字段初始值设定项无法引用非静态字段,方法,属性'ConsoleApplication1.Class1.s1

有人可以解释这里发生的事情。

感谢。

3 个答案:

答案 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;
    }
}