更好地理解范围

时间:2013-11-03 16:39:18

标签: c# scope instantiation

我对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" }
            });
        }
    }
}

3 个答案:

答案 0 :(得分: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

因此编译器抱怨。

答案 1 :(得分:0)

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

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

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

  1. 将字段设为静态。

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

答案 2 :(得分:0)

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

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