gpt4 book ai didi

关于委托(delegate)的 C# 问题

转载 作者:行者123 更新时间:2023-11-30 13:33:45 26 4
gpt4 key购买 nike

在下面的代码中,我调用扩展方法 [平均] 3 次。首先使用 lambda,然后通过匿名方法,第三次通过委托(delegate)。

委托(delegate)的方式不行。谁能解释一下为什么?

提前很多!

------------代码------------

using System.Linq;
using System.Collections.Generic;

class Program
{
static void Main(string[] args)
{
List<Person> people = new List<Person> {
new Person { FirstName = "William", LastName = "Schokkele", Age = 35 },
new Person { FirstName = "Bill", LastName = "Gates", Age = 50 },
new Person { FirstName = "Hanne", LastName = "Schokkele", Age = 7 }
};

Person myPerson = new Person { FirstName = "Hanne", LastName = "Schokkele", Age = 7 };
myDelegate myDel = new myDelegate(myPerson.GetAge);

double averageAge= people.Average(p => p.Age);
double averageAge2 = people.Average(delegate(Person p) { return p.Age; });
double averageAge3 = people.Average(myDel); //THIS LINE DOESNT WORK. ERROR MESSAGE LIST<Person> does not contains a definition for 'average'
}
}

public delegate int myDelegate(Person p);

public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }

public int GetAge(Person p)
{
return p.Age;
}
}

最佳答案

您不能在 C# 中从一种类型的委托(delegate)强制转换为另一种类型。自 IEnumerable<T>.Average 期望一个 Func<T, int> ,这是您需要提供的委托(delegate),不管它与 myDelegate 具有相同的签名这一事实.

你可以改变这个:

myDelegate myDel = new myDelegate(myPerson.GetAge);

进入:

Func<Person, int> myDel = new Func<Person, int>(myPerson.GetAge);

或者简单地将方法作为参数传递,这将为您创建适当的委托(delegate):

double averageAge3 = people.Average(myPerson.GetAge);  // this will work

注意制作GetAge实例方法(相对于静态方法)没有意义,因为它返回作为参数传递的对象的年龄,而不是父 (this) 对象。

当您查看 myPerson 时,这一点变得很明显对象,用“虚拟”值实例化,只是为了访问它的 GetAge方法,它不使用它的任何属性(您可以简单地编写 double averageAge3 = people.Average(new Person().GetAge); 并且什么都不会改变)。

我会建议使用匿名方法(首选),或者将您的 GetAge方法 static .

关于关于委托(delegate)的 C# 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5801300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com