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