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を介して任意のインスタンス メンバーを参照するとコンパイル時エラーになるためです。

(確かに、それは仕様のより奇妙な文言の 1 つです...)

代わりに、ロジックをコンストラクタ本体に配置する必要があります。

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 に答える