我对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" }
});
}
}
}
答案 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
是实例字段 - 不是静态字段。
这意味着它属于声明它的类的实例 - 没有。
有几种方法可以解决问题:
将字段设为静态。
实例化Program
并在变量上调用InitMail
。
答案 2 :(得分:0)
您正尝试从静态方法访问实例变量Mail
。
这不起作用,因为您需要类Program
的对象实例来访问实例变量