5

我已经开始学习c#了。我正在尝试声明一个类和一些变量,并尝试对字符串进行简单的连接。但是我遇到了一些错误-代码如下

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

我得到的错误是 - 字段初始化程序无法引用非静态字段、方法、属性'ConsoleApplication1.Class1.s1

有人可以解释这里发生了什么。

谢谢。

4

3 回答 3

15

有人可以解释这里发生了什么。

好吧,编译器错误消息说明了一切,真的,一旦你超越了术语。此行无效:

string s3 = s1 + s2;

您正在声明实例变量,并且s1 + s2不允许实例变量初始化程序(此处)引用正在创建的实例中的其他字段 - 或者实际上是实例本身。请记住,上述声明等同于:

string s3 = this.s1 + this.s2;

从 C# 4 规范的第 10.5.5.2 节:

实例字段的变量初始值设定项不能引用正在创建的实例。因此,this在变量初始化器中引用是编译时错误,因为变量初始化器通过simple-name引用任何实例成员是编译时错误。

(诚​​然,这是规范中更奇怪的措辞之一......)

您必须将逻辑放入构造函数主体中:

class Class1
{
    string s1 = "hi";
    string s2 = "hi";
    string s3;

    public Class1()
    {
        s3 = s1 + s2;
    }
}
于 2013-04-24T20:05:20.523 回答
8

变量不是 [逻辑上] 以特定顺序初始化的。最好将您的程序设计为无论变量初始化的顺序如何,它们都能正常工作。

对于局部变量的非平凡赋值,您可以使用该类型的构造函数:

class Class1
{
    string s1 = "hi";
    string s2 = "hi";
    string s3;

    public Class1()
    {
         s3 = s1 + s2;
    }
}
于 2013-04-24T20:04:34.363 回答
6

尝试s3在方法中初始化,最好是构造函数

class Class1
{
    string s1 = "hi";
    string s2 = "hi";
    string s3;


    public Class1()
    {
        s3 = s1 + s2;
    }
}
于 2013-04-24T20:03:57.423 回答