class Program
{
public delegate T myDel<U,T>(U u);
static void Main(string[] args)
{
List<Person> personList = new List<Person>(){
new Person{ Age=12,Name="孙俩岁" },
new Person{ Age=13,Name="dfsdfs" },
new Person{ Age=42,Name="dsf" },
new Person{ Age=22,Name="ffhtr" }
};
myDel<Person, bool> myd = new myDel<Person, bool>(getPs);
// Func<Person, bool> myd = getPs;
var lists = personList.Where(myd);
foreach (var l in lists)
{
Console.WriteLine(l.Age);
}
Console.ReadKey();
}
public static bool getPs(Person p)
{
return p.Age > 20;
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
为什么编译不通过
这是参数类型不匹配的错误。
先看personList的Where方法原型(有两个重载的Where方法):
显然楼主是准备调用第一个Where方法,其中参数为Func<TSource, bool> predicate。
在看例子的这两行代码:
myDel<Person, bool> myd = new myDel<Person, bool>(getPs)
var lists = personList.Where(myd);
其中用Program.myDel类型代替了System.Func类型。所以编译不过,因为参数类型不匹配。
虽然Program.myDel和System.Func的作用及函数签名是一样的,但它们在不同的命名空间下,仍然是不同的类型。
而Where方法明确要求参数类型是Func<TSource, bool>。
为什么不直接这样写:
var lists = personList.Where(p=>p.Age > 20);
public delegate T myDel<U,T>(U u);
T 改成具体类型,泛型委托只是委托的参数为泛型