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存在InitMail()。这意味着当方法InitMail()将被静态执行(Program.InitMail())时,它会尝试访问非静态变量Mail

因此编译器抱怨。

于 2013-11-03T16:41:56.487 回答
0

Mail是一个实例字段 - 不是静态字段。

这意味着它属于声明它的类的实例 - 没有。

有几种方法可以解决这个问题:

  1. 使字段静态。

  2. 实例化Program并调用InitMail变量。

于 2013-11-03T16:41:33.160 回答
0

您正在尝试Mail从静态方法访问实例变量。

这不起作用,因为您需要类的对象实例Program来访问实例变量

于 2013-11-03T16:42:03.463 回答