C#匿名方法获胜';我跑不了。未设置对象引用

C#匿名方法获胜';我跑不了。未设置对象引用,c#,.net,reference,anonymous-methods,C#,.net,Reference,Anonymous Methods,刚开始,需要所有的帮助。下面的代码将不会运行。Error msg表示“引用未设置为对象的实例”,它指向WriteLine方法中的employee引用。好心协助 class Program { static void Main(string[] args) { List<Employee> empList = new List<Employee>() { new Employee { ID = 101,

刚开始,需要所有的帮助。下面的代码将不会运行。Error msg表示“引用未设置为对象的实例”,它指向WriteLine方法中的employee引用。好心协助

class Program
{
    static void Main(string[] args)
    {
        List<Employee> empList = new List<Employee>()
        { 
           new Employee { ID = 101, Salary = 6000000, Name = "Jane" },
           new Employee{ ID = 102, Salary = 6000000, Name = "Jane" },
           new Employee { ID = 103, Salary = 6000000, Name = "James" },
           new Employee{ ID = 104, Salary = 6000000, Name = "Jasmie" },
           new Employee { ID = 105, Salary = 6000000, Name = "Janet" },
        };

        Predicate<Employee> emPredicate = new Predicate<Employee>(getEmpName);
        Employee employee = empList.Find(emp=>  emPredicate(emp)); 

        Console.WriteLine(" ID = {0}, Name = {1}",employee.ID,employee.Name );
        Console.ReadLine();
    }

    public static bool getEmpName(Employee em)
    {
        return em.ID == 002;
    }
}

class Employee 
{
    public int ID { get; set; }
    public int Salary { get; set; }
    public string Name { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
List empList=新列表()
{ 
新员工{ID=101,工资=6000000,Name=“Jane”},
新员工{ID=102,工资=6000000,Name=“Jane”},
新员工{ID=103,工资=6000000,Name=“James”},
新员工{ID=104,工资=6000000,Name=“Jasmie”},
新员工{ID=105,工资=6000000,Name=“Janet”},
};
谓词emPredicate=新谓词(getEmpName);
Employee=empList.Find(emp=>emPredicate(emp));
WriteLine(“ID={0},Name={1}”,employee.ID,employee.Name);
Console.ReadLine();
}
公共静态bool getEmpName(Employee em)
{
返回em.ID==002;
}
}
班级员工
{
公共int ID{get;set;}
公共整数{get;set;}
公共字符串名称{get;set;}
}
来自:

返回值类型:T

与条件匹配的第一个元素 由指定谓词定义(如果找到);否则,将显示默认值 类型T的值

它没有找到匹配项,因此返回
default(t)
,即
null
。在
Console.WriteLine
之前添加一个空值,当然,还要更正
getEmpName
谓词(我假设您需要检查
em.ID==102
):

  • 如果您的程序在运行时抛出异常,则表示它确实编译

  • 没有ID为
    002
    的员工。这就是为什么
    Find
    方法返回null,您将得到
    NullReferenceException

  • 我会为我的方法使用更合适的名称。例如,
    getEmpName
    不返回名称,而是返回bool,这使得谓词有点混乱。您可以将其命名为
    GetEmployeeById
    ,并且可以将
    id
    参数添加到方法中,这样会有一些意义。您还可以使用:

    Employee employee = empList.Find(emp => emp.ID == 2); 
    

  • 如果您只是想找到ID为2的员工。

    看起来您只是在getEmpName()中用手指粗敲了0而不是1。你的意思是打102而不是002吗?可能是重复的谢谢一串。输入102,它确实被编译了。我必须设法掌握基本知识和细节。谢谢你的建议。输入102,它确实被编译了。我会按照你说的命名。希望我能更好地理解异常消息。再次感谢汉克斯,特别是关于无效的那一点。我以前见过它,但现在我需要使用它,这就更有意义了。你解释Find方法的方式很深刻。有什么材料可以帮我解决这样的问题吗?再次感谢!任何方法所需的所有文档,搜索,都在那里:)注意,如果提供的任何答案对您的问题有帮助,您应该标记一个可接受的答案。要做到这一点,请勾选答案投票表下方的空复选标记,一旦单击它,它将变为绿色。谢谢。我来看看!
    Employee employee = empList.Find(emp => emp.ID == 2);