首页 新闻 会员 周边

无法从用法中推导出方法

0
悬赏园豆:40 [已解决问题] 解决于 2010-10-14 17:39

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; }
    }

 

为什么编译不通过

iamyuer的主页 iamyuer | 初学一级 | 园豆:165
提问于:2010-10-13 15:47
< >
分享
最佳答案
0

这是参数类型不匹配的错误。

先看personList的Where方法原型(有两个重载的Where方法):

  1. public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
  2. public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate)

显然楼主是准备调用第一个Where方法,其中参数为Func<TSource, bool> predicate

在看例子的这两行代码:

myDel<Person, bool> myd = new myDel<Person, bool>(getPs)

var lists = personList.Where(myd);

其中用Program.myDel类型代替了System.Func类型。所以编译不过,因为参数类型不匹配。

虽然Program.myDelSystem.Func的作用及函数签名是一样的,但它们在不同的命名空间下,仍然是不同的类型。

而Where方法明确要求参数类型是Func<TSource, bool>

收获园豆:30
wang_yb | 老鸟四级 |园豆:4891 | 2010-10-13 21:31
其他回答(2)
0

为什么不直接这样写:

var lists = personList.Where(p=>p.Age > 20);

收获园豆:10
I,Robot | 园豆:9783 (大侠五级) | 2010-10-13 16:51
0

public  delegate  T myDel<U,T>(U u);

 

T 改成具体类型,泛型委托只是委托的参数为泛型

 

一滴血 | 园豆:1602 (小虾三级) | 2010-10-13 18:15
T 改成具体类型还是编译不过,同样的错误。不知您是怎么试的
支持(0) 反对(0) wang_yb | 园豆:4891 (老鸟四级) | 2010-10-13 21:07
@wang_yb:var lists = personList.Where(myd); where里的参数应该是一个相当于personList的对象lambda表达式
支持(0) 反对(0) 一滴血 | 园豆:1602 (小虾三级) | 2010-10-13 23:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册