泛型委托 public delegate TResult Func<T, TResult>(
T arg
)
 泛型方法:public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)----
应用
List<string> fruits = new List<string> { "apple", "passionfruit", "banana", "mango", 
                    "orange", "blueberry", "grape", "strawberry" };IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);
foreach (string fruit in query)
    Console.WriteLine(fruit);首先 lambda表达式如果换成匿名方法 delegate(string fruit){return fruit.Length < 6;}这样对不对?
其次,目前我只能理解到,因为变量fruits,可以由编译器推出类型TSource 为string是吗?所以,委托Func<TSource, bool> predicate自然就推出是
Func<string, bool> predicate。然后就与对应的匿名方法delegate(string fruit){return fruit.Length < 6;}在返回值与参数类型上一致了,是吧?
最后,我感觉,委托总要通过调用才能发挥作用的。 
string str="pea";
predicate(string str);//可是,用了refelctor,没看到有类似的语句。
对于上面的例子,难道是foreach (string fruit in query) 这句才真正通过委托调用的方法吗?==========================
大侠能不能举个简单的详细的例子来说明这一用法啊,我主要是对于泛型委托作为一个泛型方法的参数这种用法比较糊涂,不是理解不了委托作为参数,是理解不了具体是怎么实现的。
    
  

解决方案 »

  1.   

    泛型是在调用后确定的,比如泛型方法void M1<Ta1>(Ta1 ta1){//...}...
    this.M1("sss");
    this.M1(25f);
      

  2.   

    对 就是这点不明白传给委托变量的只是个匿名委托或lambda表达式,但是,参数是怎么传的?就是调用的这句,this.M1("sss"); 这个sss是怎么传进去的啊?
      

  3.   

    ...
    void M2<Ta>(Action<Ta> act,Ta ta)
    {
      //...
      act.Invoke(ta);
      //...
    }//...
    this.M2(x=> MessageBox.Show(x),"sss");//C#3.0上面还有试过,估计是这样的..它可以自己推断出来
      

  4.   

    感觉好复杂说一下我的理解,public static IEnumerable <TSource> Where <TSource>( 
    this IEnumerable <TSource> source, 
    Func <TSource, bool> predicate 这个扩展方法是为IEnumerable <TSource> 泛型接口扩展的方法,所以说只要泛型接口指定了一个泛型参数,where方法的泛型参数就被指定了,剩下的就是一个同这个泛型IEnumerable <TSource> 的泛型参数一样,并且第二个参数是一个bool类型的委托,这个委托“貌似”已经被定义了,这里我对于泛型委托的定义还是有点迷糊public delegate TResult Func <T, TResult>( 
    T arg 
    ) 如果使用这个委托,根据上面得出他需要返回一个泛型IEnumerable <TSource>,并且参数为bool的一个实例或者匿名方法或者lamba下面是重点了,因为实现了一个泛型接口
    List <string> fruits
    注意list<t>实现了IEnumerable <T>,根据多态它可以被看做一个IEnumerable <T>,所以它具有where《t》泛型扩展方法
    ,所以当他(fruits)调用泛型where方法时,实际上是在调用where<string>,我们不必再指定泛型参数,因为在实例化list《string》的时候已经指定了这样唯一要做的就是为where添参数,根据上面对where《string》的定义,要求实例化一个 public delegate bool func<string,bool>(string)的方法,如果么有实例方法,自然是匿名方法delegate(string x){return x.length<6}
      

  5.   

    对 现在不理解的就是 匿名方法的参数x 是怎么赋的值并在扩展方法内部被定义好的委托调用的。举个最简单的, delegate int addhandler(int a,int b);
     
     
     addhandler deladd=delegate(int x,int y){return x+y;} 我们在实际应用的时候 不是应该有一句int i=deladd(3,6)// i=9
    对吧。
    但是 在扩展方法里,即使有这句deladd(3,6)
     也应该是这样的形式。
     int c=3;
    int d=6;
    int i=deladd(c,d);
    但是,我不明白的是,lambda表达式相当于匿名方法,在我看来,就是直接在参数中定义了委托要调用的方法,但是,参数的值是从那传过去的呢?
      

  6.   

    (3,6)=>{return 3*6;};这个相当于一个delegate int TestHandler(int i,int j);前面括号中的是参数,如果只有一个参数括号可以省略.C#3.0的意思是,可以不定义这个委托直接用Lambda表达式(在调用时,例如做为参数传递给某方法啊这些)更多我也不清楚,学习.