Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要一些初级C#代码的解释吗_C# - Fatal编程技术网

需要一些初级C#代码的解释吗

需要一些初级C#代码的解释吗,c#,C#,我已经开始学c了。我试图声明一个类和一些变量,并尝试对字符串进行简单的串联。但我得到一些错误-代码如下 namespace ConsoleApplication1 { class Class1 { string s1 = "hi"; string s2 = "hi"; string s3 = s1 + s2; } } 我得到的错误是- 字段初始值设定项无法引用非静态字段、方法、属性“ConsoleApplication1.

我已经开始学c了。我试图声明一个类和一些变量,并尝试对字符串进行简单的串联。但我得到一些错误-代码如下

namespace ConsoleApplication1
{
    class Class1
    {
        string s1 = "hi";
        string s2 = "hi";
        string s3 = s1 + s2;
    }
}
我得到的错误是- 字段初始值设定项无法引用非静态字段、方法、属性“ConsoleApplication1.Class1.s1”

有人能解释一下这里发生了什么吗


谢谢。

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

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


    public Class1()
    {
        s3 = s1 + s2;
    }
}

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

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

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

    public Class1()
    {
         s3 = s1 + s2;
    }
}
有人能解释一下这里发生了什么吗

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

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

这是不正确的。根据C#4规范第10.5.5节(我手头上的版本):“同样,当创建一个类的实例时,该实例中的所有实例字段首先初始化为其默认值,然后按照文本顺序执行实例字段初始值设定项。”(我的重点。)@JonSkeet I编辑了措辞。不管实现是否有顺序,从概念的角度来看,它没有顺序,并且最好像无序一样进行开发。使用调试器可以很容易地确认这一点。在我自己的代码中,我确实注意到了实例字段初始化的行为。@Servy:我没有引用实现细节。我引用了说明书。另见第10.5.5.2节。我同意最好不要使用它,因为它会使代码变得脆弱——但它是经过良好指定的(除非您使用的是分部类,其中“文本顺序”没有得到很好的定义)。还要注意的是,静态初始值设定项没有这样的限制。@JonSkeet:我想起了亚伯拉罕·林肯常说的不朽的话:如果你称尾巴为腿,一只羊有几条腿?四,;将尾部称为支腿并不能使其成为支腿。问题不在于它在做“算术”(字符串串联)这一事实,而在于它隐式地使用了
this