Func<DerivedFromT,object>
представляет метод, который принимает параметр DerivedFromT
. Func<T,object>
представляет метод, который принимает параметр T
. Через дисперсию делегата , представленную в C # 4, вы можете привести Func<T,object>
к Func<DerivedFromT,object>
, но не наоборот (как вы запрашиваете).
Подумайте, что это значит:
public class Person { }
public class Student : Person { }
public static class School
{
public static object Greet(Person person)
{
return null;
}
public static object Promote(Student student)
{
return null;
}
}
В этом случае метод Greet
соответствует делегату Func<Person,object>
, а метод Promote
соответствует делегату Func<Student,object>
.
Func<Person, object> greetPerson = School.Greet;
Func<Student, object> promoteStudent = School.Promote;
Мы можем разыграть Greet
до Func<Student,object>
; если мы можем приветствовать Person
, то мы также можем приветствовать Student
(который гарантированно будет специализированной формой Person
).
Func<Student, object> greetStudent = greetPerson;
Однако мы не можем разыграть Promote
до Func<Person,object>
; хотя мы можем рекламировать Student
, мы не можем рекламировать вообще Person
, если только он / она не является Student
.
Func<Person, object> promotePerson = promoteStudent; // Will not compile.
Если мы знаем, что наш Person
- студент, мы можем указать это, применив его:
Func<Person, object> promotePerson =
personWhoIsActuallyStudent => promoteStudent((Student)personWhoIsActuallyStudent);