C#Func委托与lambda表达式组合不正确

时间:2017-06-16 11:24:03

标签: c# lambda delegates func

我有一个Employee类,有一些基本的params,以及一个有雇员对象列表的班级员工。我想在类员工中使用func委托,以便能够在主类中使用以下lambda表达式。我想我在这里有一些语法错误......我收到以下错误消息:"无法将lambda表达式转换为' Employee'因为它不是代表类型"。

有人知道我做错了什么吗?

非常感谢你们!

static void Main(string[] args)
        {
            Employees lijst = new Employees();
            lijst.Add(new Employee("B1", 200));
            lijst.Add(new Employee("B2", 100));
            lijst.Add(new Employee("B3", 300));

            lijst.Wijzig((Employee b) => b.Salary += 100);

            Console.ReadKey();
        }


class Employee
    {
        public String Name { get; set; }
        public int Salary { get; set; }



        public Employee(String Name, int Salary)
        {
            this.Name = Name;
            this.Salary = Salary;

        }
    }


class Employees
    {
        public Func<Employee, int> Wijzig = new Func<Employee, int>(Change);
        private ArrayList _lijst = new ArrayList();

        public void Add(Employee e)
        {
            _lijst.Add(e);
        }

        static int Change(Employee b)
        {

            return 0;
        }
    }

3 个答案:

答案 0 :(得分:1)

WijzigFunc<Employee, int>类型的委托。即它是一个接受员工对象并返回整数的方法。所以lijst.Wijzig会返回此委托。如果要调用此委托,则应传递employee对象(根据签名Func<Employee, int>),但是您传递的是lambda委托而不是员工。正确的调用:

  lijst.Wijzig(someEmployee);  // calls Employees.Change

这将调用int Change(Employee b)方法。但似乎你不想调用Change方法(除了返回零之外什么都不做)。你想要调用一些真正的变化 - 工资增量。因此,您应该做的第一步是更改分配给Wijzig的委托,然后使用您的雇员对象调用此委托:

 lijst.Wijzig = (Employee b) => { b.Salary += 100; return 0; }
 lijst.Wijzig(someEmployee); // calls lambda which we assigned

注意:

  • 在.NET 2.0+中使用ArrayList是没有意义的,你应该使用像List<Employee>这样的通用集合。
  • 不清楚为什么你的Change方法返回一个整数。考虑让它无效。
  • 您正在重新实现功能LINQ - 有一个ForEach扩展方法,它接受对集合的每个项目执行的操作。

        var list = new List<Employee> {
            new Employee("B1", 200),
            new Employee("B2", 100),
            new Employee("B3", 300)
        };
    
        list.ForEach(e => e.Salary += 100);
    

那就是它。您的所有代码都没有自定义类。

答案 1 :(得分:1)

这是我的主要功能没有变化的解决方案:

    static void Main(string[] args)
    {
        Employees lijst = new Employees();
        lijst.Add(new Employee("B1", 200));
        lijst.Add(new Employee("B2", 100));
        lijst.Add(new Employee("B3", 300));

        lijst.Wijzig((Employee b) => b.Salary += 100);

        lijst.Print();

        Console.ReadKey();
    }


    class Employee
    {
        public String Name { get; set; }
        public int Salary { get; set; }

        public Employee(String Name, int Salary)
        {
            this.Name = Name;
            this.Salary = Salary;
        }
    }


    class Employees
    {
        // [Delete]
        // public Func<Employee, int> Wijzig = new Func<Employee, int>(Change);
        private ArrayList _lijst = new ArrayList();

        public void Add(Employee e)
        {
            _lijst.Add(e);
        }

        // [Delete]
        //static int Change(Employee b)
        //{
        //    return 0;
        //}

        // [New]
        public void Wijzig(Func<Employee, int> func) 
        {
            foreach (Employee e in _lijst)
            {
                func(e);
            }
        }

        public void Print() 
        {
            foreach (Employee e in _lijst)
            {
                Console.WriteLine(e.Name + "\t" + e.Salary);
            }
        }
    }

答案 2 :(得分:0)

您的以下代码行调用func

lijst.Wijzig((Employee b) => b.Salary += 100);

应该在下面,传递Employee对象

int result = lijst.Wijzig(lijst[0]);