【问题标题】:C# Func delegate in combination with lambda expression not correctC# Func 委托与 lambda 表达式组合不正确
【发布时间】:2017-06-16 11:24:02
【问题描述】:

我有一个 Employee 类,有一些基本参数,还有一个类 employees,有一个员工对象列表。我想在员工类中使用 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;
        }
    }

【问题讨论】:

  • 确实是的,但是如果我把Wijzig改成Change,问题还是一样...
  • 你的Wizjig 应该怎么做呢?它的目的是什么?

标签: c# lambda delegates func


【解决方案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】:

    WijzigFunc&lt;Employee, int&gt; 类型的委托。 IE。它是一种接受员工对象并返回整数的方法。所以lijst.Wijzig 返回这个委托。如果你想调用这个委托,你应该传递员工对象(根据签名Func&lt;Employee, int&gt;),但是你传递的是 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&lt;Employee&gt; 这样的泛型集合。
    • 不清楚为什么你的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);
      

    就是这样。没有自定义类的所有代码。

    【讨论】:

    • 非常感谢您的回复!有什么办法不改变这行代码:“lijst.Wijzig((Employee b) => b.Salary += 100);”而是改为更改“Change()”方法?
    • @MathiasVerhoeven Change 方法无法更改 - 它在编译期间定义并保留在那里。但是你可以做相反的事情——在Change 方法中使用Wijzig。我给你举个例子。
    • @MathiasVerhoeven 你能描述一下Change 方法的用途吗?
    【解决方案3】:

    你下面的代码行调用func

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多