0

私はまだ C# に慣れていませんが、スコープの概念は理解できたと思います。プログラムに問題があり、助けていただければ幸いです。

次のコードの問題は、35 行目で失敗することです。

「非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です」。

オブジェクト Mail が Program クラスの一部としてインスタンス化されており、グローバルにアクセスできるように見えることがわかります。しかし、InitMail() メソッドで Mail.Add を使用しようとすると、Mail オブジェクトが認識されません。

インスタンス化と InitMail コードを Main() に移動すると、問題なく動作します (ただし、インスタンス化の public 修飾子も削除する必要があります)。ここで何が理解できませんか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace TestApp1103
{
    class Program
    {
        // Define an enum type named "Division" specifying all possible values:
        public enum Division {PFR, PSE, PVF, PVM, PVS}

        //Define a generic class named "MailList" and specify accessor methods:
        public class MailList
        {
            public Division Div { get; set;}
            public string[] SuccAddr { get; set; }
            public string[] FailAddr { get; set; }
        }

        // Instantiate a MailList object named "Mail":
        public List<MailList> Mail = new List<MailList>();

        static void Main(string[] args)
        {
            // Populate the object "Mail":
            InitMail();
        }

        static void InitMail()
        {
            Mail.Add( new MailList()
            {
            Div = Division.PFR,
            SuccAddr = new string[2] { "addr1@contoso.com", "addr2@contoso.com" },
            FailAddr = new string[2] { "addr3@contoso.com", "addr4@contoso.com" }
            });
        }
    }
}
4

3 に答える 3

1
static void InitMail() {
        Mail.Add( new MailList() {
        // properties
        });
    }

MailListに新しいオブジェクトを追加しようとしますMail。ただし、 を見るとMail、次の宣言が表示されます。

public List<MailList> Mail = new List<MailList>();

staticにはwhich が存在しないことに注意してくださいInitMail()。これは、メソッドInitMail()が静的に実行される場合 ( Program.InitMail())、非静的変数にアクセスしようとすることを意味しますMail

したがって、コンパイラは文句を言います。

于 2013-11-03T16:41:56.487 に答える
0

Mail静的メソッドからインスタンス変数にアクセスしようとしています。

Programインスタンス変数にアクセスするにはクラスのオブジェクトインスタンスが必要なため、これは機能しません

于 2013-11-03T16:42:03.463 に答える
0

Mail静的フィールドではなく、インスタンスフィールドです。

これは、それが宣言されているクラスのインスタンスに属していることを意味します - それはありません。

この問題を解決するには、いくつかの方法があります。

  1. フィールドを静的にします。

  2. 変数をインスタンスProgram化して呼び出しInitMailます。

于 2013-11-03T16:41:33.160 に答える