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

我有一个Employee类,带有一些基本参数,以及一个拥有员工对象列表的班级员工。 我想在类员工中使用func委托,以便能够在主类中使用以下lambda表达式。 我想我在这里有一些语法错误...我得到以下错误消息:“不能转换lambda表达式键入'员工',因为它不是委托类型”。

有人知道我做错了什么?

非常感谢你们!

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;
        }
    }

这是我的解决方案,在Main函数中没有改变:

    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);
            }
        }
    }

Wijzig是类型为Func<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);
    
  • 而已。 所有你的代码没有自定义类。


    你的下面的代码行来调用func

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

    应该在下面传递一个Employee对象

    int result = lijst.Wijzig(lijst[0]);
    
    链接地址: http://www.djcxy.com/p/31597.html

    上一篇: C# Func delegate in combination with lambda expression not correct

    下一篇: Can a C# lambda expression have more than one statement?