Нельзя приводить делегатов одного типа к другому в C #.Поскольку IEnumerable<T>.Average
ожидает Func<T, int>
, то есть делегата, который вам нужно предоставить, независимо от того, что он имеет ту же подпись, что и myDelegate
.
. Вы можете изменитьэто:
myDelegate myDel = new myDelegate(myPerson.GetAge);
в:
Func<Person, int> myDel = new Func<Person, int>(myPerson.GetAge);
или просто передайте метод в качестве параметра, который создаст для вас подходящий делегат:
double averageAge3 = people.Average(myPerson.GetAge); // this will work
Примечаниечто создание GetAge
метода экземпляра (вместо статического метода) не имеет смысла , поскольку он возвращает возраст объекта, переданного в качестве параметра, вместо родительского (this
) объекта.
Это становится очевидным, когда вы смотрите на объект myPerson
, который создается с использованием "фиктивных" значений, просто чтобы получить доступ к его GetAge
методу, который не использует ни одного из его свойств (вымог бы просто написать double averageAge3 = people.Average(new Person().GetAge);
и ничего бы не изменилось).
Я бы порекомендовал либо использовать анонимный метод (предпочтительно), либо сделать свой GetAge
метод static
.