我正在尝试在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',因为它不是委托类型
什么是正确的语法?
答案 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 ); } } );
}
}