C#匿名方法不会运行。未设置对象引用

时间:2014-07-25 12:43:46

标签: c# .net reference anonymous-methods

刚开始并需要所有帮助。以下代码将无法运行。错误消息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; }
}

2 个答案:

答案 0 :(得分:5)

  1. 如果你的程序在运行时抛出一个异常,那就意味着它会编译

  2. 没有ID 002的员工。这就是Find方法返回null并获得NullReferenceException的原因。

  3. 我会为我的方法使用更合适的名称。例如getEmpName没有返回名称,它返回 bool ,这会使您的谓词有点混乱。您可以将其命名为GetEmployeeById,然后您可以在方法中添加id参数,然后它就会有所帮助。您也可以使用:

    Employee employee = empList.Find(emp => emp.ID == 2); 
    
  4. 如果您只是想找到ID为2的员工。

答案 1 :(得分:4)

来自List<T>.Find

  

返回值类型:T

     

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

找不到匹配项,因此返回default(T),即null。在Console.WriteLine之前添加无效,当然,更正您的getEmpName谓词(我假设您要检查em.ID == 102):

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