C# 更好地理解范围

C# 更好地理解范围,c#,scope,instantiation,C#,Scope,Instantiation,我对C#还是很陌生,但我认为我理解范围的概念。我在一个程序上遇到了问题,我非常感谢您的帮助 以下代码的问题是,第35行在 “非静态字段、方法或属性需要对象引用” 您可以看到,对象邮件被实例化为Program类的一部分,它似乎应该是全局可访问的。但是当我尝试在InitMail()方法中使用Mail.Add时,它无法识别邮件对象 如果我将实例化和InitMail代码移到Main()中,它就可以正常工作(尽管我还必须删除实例化的public修饰符)。我在这里不明白什么 using System; us

我对C#还是很陌生,但我认为我理解范围的概念。我在一个程序上遇到了问题,我非常感谢您的帮助

以下代码的问题是,第35行在

“非静态字段、方法或属性需要对象引用”

您可以看到,对象邮件被实例化为Program类的一部分,它似乎应该是全局可访问的。但是当我尝试在InitMail()方法中使用Mail.Add时,它无法识别邮件对象

如果我将实例化和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" }
            });
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
名称空间testap1103
{
班级计划
{
//定义名为“Division”的枚举类型,指定所有可能的值:
公共枚举分区{PFR、PSE、PVF、PVM、PVS}
//定义名为“MailList”的泛型类并指定访问器方法:
公共类邮件列表
{
公除法Div{get;set;}
公共字符串[]SuccAddr{get;set;}
公共字符串[]FailAddr{get;set;}
}
//实例化名为“邮件”的邮件列表对象:
公共列表邮件=新列表();
静态void Main(字符串[]参数)
{
//填充对象“邮件”:
InitMail();
}
静态void InitMail()
{
Mail.Add(新邮件列表()
{
Div=Division.PFR,
SuccAddr=新字符串[2]{”addr1@contoso.com", "addr2@contoso.com" },
FailAddr=新字符串[2]{”addr3@contoso.com", "addr4@contoso.com" }
});
}
}
}
邮件
是一个实例字段,而不是静态字段

这意味着它属于它所声明的类的实例,而这个类没有实例

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

  • 使字段保持静态

  • 实例化
    Program
    并调用变量上的
    InitMail

  • 这将尝试将新的
    邮件列表
    对象添加到
    邮件
    。 但是,当我们查看
    邮件时,我们会看到以下声明:

    公共列表邮件=新列表()

    请注意,在
    InitMail()
    中没有出现
    static
    。 这意味着当方法
    InitMail()
    将静态执行(
    Program.InitMail()
    )时,它将尝试访问非静态变量
    Mail


    因此编译器会抱怨。

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


    这无法工作,因为您需要类
    程序的对象实例
    来访问实例变量

    您知道其他编程语言吗?问题与范围无关<代码>邮件
    在范围内。如果它不在范围内,那么错误将是“在范围内找不到任何所谓的邮件”。现在,你有一个objectlist列表,你称之为object,而我相信大多数人会更乐意将一个objectlist列表称为objectlist:)Oded:我用你的第一个建议将字段设置为静态。我更改了实例化行以包含静态修饰符,如下所示:
    publicstaticlistmail=newlist()这似乎是可行的。非常感谢你的帮助!
    
    static void InitMail() {
            Mail.Add( new MailList() {
            // properties
            });
        }