无法编译lambda表达式,因为该类型不是委托

时间:2013-11-19 12:23:36

标签: c# lambda

我正在尝试在C#中使用lambda表达式:

using System;

namespace ConsoleApplication1 {
   public struct Point {
      public int x;
      public int y;

      public Point( int x, int y ) {
         this.x = x;
         this.y = y;
      }
   }

   public interface Mobile {
      Point getPosition();
   }

   public class Program {
      public void mth( Mobile mobile ) {
         Point p = mobile.getPosition();
         Console.WriteLine( "{ " + p.x + ", " + p.y + " }" );
      }

      static void Main( string[] args ) {
         new Program().mth( () => { return new Point( 4, 5 ); } ); <<<<<<<< ERROR
      }
   }
}

编译器错误(法语):

  

不可能的de convertir表达式lambda en类型   'ConsoleApplication1.Mobile',car il ne s'agit pas d'untypedélégué

国际英语翻译:

  

无法将lambda表达式转换为type   'ConsoleApplication1.Mobile',因为它不是委托类型

什么是正确的语法?

2 个答案:

答案 0 :(得分:4)

您似乎混淆了界面委托

接口粗略地说是一个或多个方法的集合。 由一个为每个方法提供实现的类实现;你不能用lambda方法构建一个实现。

委托基本上是一个命名方法签名。只要签名正确,您就可以将lambda方法转换为委托,或者您可以创建指向类上方法的委托,例如。

认为使您的代码工作的目的是将您的Mobile转变为代理人:

// This can represent any function that takes nothing and returns a point.
public delegate Point Mobile();

public class Program {

    // This takes any "Mobile" function, calls it and displays the result.      
    public void mth(Mobile getPosition) {
        Point p = getPosition();
        Console.WriteLine("{ " + p.x + ", " + p.y + " }");
    }

    // This calls mth with a lambda that matches the "Mobile" definition.
    static void Main( string[] args ) {
        new Program().mth(() => { return new Point( 4, 5 ); }); 
    }

    // You could also explicitly create a "Mobile".
    static void Main2( string[] args ) {
        Mobile myMobile = new Mobile(() => { return new Point( 4, 5 ); });
        new Program().mth(myMobile); 
    }
}

答案 1 :(得分:-1)

   public class Mobile {
      public Func<Point> GetPosition { get; set; }
   }

   public class Program {
      public void mth( Mobile mobile ) {
         Point p = mobile.GetPosition();
         Console.WriteLine( "{ " + p.x + ", " + p.y + " }" );
      }

      static void Main( string[] args ) {
         new Program().mth( new Mobile { GetPosition = () => { return new Point( 4, 5 ); } } ); 
      }
   }