(Lambda函数可能是也可能不是我要找的,我不确定)
基本上我想要完成的是:
int areaOfRectangle = (int x, int y) => {return x * y;};
但它给出了错误:“无法将lambda表达式转换为类型'int',因为它不是委托类型”
更详细的问题(这与问题无关,但我知道有人会问)是:
我有几个函数从重写的OnLayout分支,还有几个函数,每个函数依赖于它们。为了便于阅读并为以后的扩展设置先例,我希望从OnLayout分支的函数看起来都相似。为此,我需要对它们进行划分并尽可能重用命名:
protected override void OnLayout(LayoutEventArgs levent)
switch (LayoutShape)
{
case (square):
doSquareLayout();
break;
case (round):
doRoundLayout();
break;
etc..
etc..
}
void doSquareLayout()
{
Region layerShape = (int Layer) =>
{
//do some calculation
return new Region(Math.Ceiling(Math.Sqrt(ItemCount)));
}
int gradientAngle = (int itemIndex) =>
{
//do some calculation
return ret;
}
//Common-ish layout code that uses layerShape and gradientAngle goes here
}
void doRoundLayout()
{
Region layerShape = (int Layer) =>
{
//Do some calculation
GraphicsPath shape = new GraphicsPath();
shape.AddEllipse(0, 0, Width, Height);
return new Region(shape);
}
int gradientAngle = (int itemIndex) =>
{
//do some calculation
return ret;
}
//Common-ish layout code that uses layerShape and gradientAngle goes here
}
我现在发现的所有例子都说你必须宣布一个代表,但我知道我看过一个单行的lambda声明......
答案 0 :(得分:6)
请尝试Func<int, int, int> areaOfRectangle = (int x, int y) => { return x * y;};
。
Func
与代理人一样工作
Look here for more info on lamda expression usage
This answer is also related and has some good info
如果你这样做是为了提高可读性并且要重现相同的函数layerShape
和gradientAngle
,你可能希望为这些函数设置显式委托来表明它们实际上是相同的。只是一个想法。
答案 1 :(得分:2)
试试这个;
Func<int, int, int> areaOfRectangle = (int x, int y) => { return x * y; };
从 MSDN检查 Func<T1, T2, TResult>
;
封装具有两个参数并返回值的方法 由TResult参数指定的类型。
答案 2 :(得分:1)
变量类型基于您的参数和返回类型:
Func<int,int,int> areaOfRectangle = (int x, int y) => {return x * y;};
答案 3 :(得分:1)
你关闭了:
Func<int, int, int> areaOfRectangle = (int x, int y) => {return x * y;};
因此,对于您的具体案例,您的声明将是:
Func<int, Region> layerShape = (int Layer) =>
...