private void SimpleLambda()
{
dynamic showMessage = x => MessageBox.Show(x);
showMessage("Hello World!");
}
错误讯息是: 无法将lambda表达式转换为动态类型,因为它不是委托类型
任何帮助,
答案 0 :(得分:16)
这与MessageBox
无关 - 正如错误消息所示,您根本无法将lambda表达式转换为dynamic
,因为编译器不知道创建实例的委托类型是什么
你想:
Action<string> action = x => MessageBox.Show(x);
甚至可以使用方法组转换,但必须匹配返回类型:
Func<string, DialogResult> func = MessageBox.Show;
如果您愿意,可以然后使用dynamic
:
dynamic showMessage = action; // Or func
showMessage("Hello World!");
或者,您可以在显式委托实例表达式中指定lambda表达式:
dynamic showMessage = new Action<string>(x => MessageBox.Show(x));
答案 1 :(得分:5)
private void SimpleLambda()
{
Action<string> showMessage = x => MessageBox.Show(x);
showMessage("Hello World!");
}
答案 2 :(得分:4)
您必须声明委托类型。否则它将不知道它应该是什么类型的lambda表达式 - x
可以是任何东西。这应该有效:
Action<string> showMessage = x => MessageBox.Show(x);
有关此委托类型的说明,请参阅Action<T>
。
答案 3 :(得分:1)
我为此创建了一个类型推理助手。如果我想将它们存储在临时变量中,我不喜欢输入lambdas的签名,所以我写了
var fn = Func.F( (string x) => MessageBox.Show(x) );
或
var fn = Func.F( (double x, double y) => x + y );
你仍然需要输入参数signiture,但是你让类型推断处理返回类型。
实施
using System;
namespace System
{
/// <summary>
/// Make type inference in C# work harder for you. Normally when
/// you want to declare an inline function you have to type
///
/// Func<double, double, double> fn = (a,b)=>a+b
///
/// which sux! With the below methods we can write
///
/// var fn = Func.F((double a, double b)=>a+b);
///
/// which is a little better. Not as good as F# type
/// inference as you still have to declare the args
/// of the function but not the return value which
/// is sometimes not obvious straight up. Ideally
/// C# would provide us with a keyword fun used like
///
/// fun fn = (double a, double b)=>a+b;
///
/// but till then this snippet will make it easier
///
/// </summary>
public static class Func
{
public static Func<A> F<A>(Func<A> f)
{
return f;
}
public static Func<A,B> F<A, B>(Func<A, B> f)
{
return f;
}
public static Func<A,B,C> F<A, B,C>(Func<A, B,C> f)
{
return f;
}
public static Func<A,B,C,D> F<A,B,C,D>(Func<A,B,C,D> f)
{
return f;
}
public static Func<A,B,C,D,E> F<A,B,C,D,E>(Func<A,B,C,D,E> f)
{
return f;
}
public static Action A(Action f)
{
return f;
}
public static Action<_A> A<_A>(Action<_A> f)
{
return f;
}
public static Action<_A,B> A<_A, B>(Action<_A, B> f)
{
return f;
}
public static Action<_A,B,C> A<_A, B,C>(Action<_A, B,C> f)
{
return f;
}
public static Action<_A,B,C,D> A<_A,B,C,D>(Action<_A,B,C,D> f)
{
return f;
}
public static Action<_A,B,C,D,E> A<_A,B,C,D,E>(Action<_A,B,C,D,E> f)
{
return f;
}
}
}