C# C语言中的Lambda函数行为怪异

C# C语言中的Lambda函数行为怪异,c#,lambda,C#,Lambda,什么是导致该代码失效的原因 Line ScoreLine; ScoreLine = Charting.CreateLine( "Score", "", Symbol, new Pen(Color.Pink), LineStyle.Line, Charting.PriceChart, 2 ); 导致不同于的行为 Line ScoreLine; Func<string, Color, int, Line> createLine = (string la

什么是导致该代码失效的原因

Line ScoreLine;
ScoreLine = Charting.CreateLine(
        "Score", "", Symbol, new Pen(Color.Pink),
         LineStyle.Line, Charting.PriceChart, 2
);
导致不同于的行为

Line ScoreLine;
Func<string, Color, int, Line> createLine
= (string label, Color color, int pad)
=> Charting.CreateLine(label, "", Symbol, new Pen(color),
                       LineStyle.Line, Charting.PriceChart, pad);
ScoreLine = createLine("Score", Color.Pink, 2);

这看起来像是一个微不足道的重构,但第二个版本的行为非常奇怪。lambda函数的参数似乎无关紧要,而且事先设置为特定的值。

我看到的一件事是,在不知道这些图表是什么的情况下,Func表示它返回一行,但在使用lambda时,您将方法调用的结果分配给ScoreLine。在非lambda示例中,将结果指定给行。这可能是个问题吗?您没有说明分数线和线的类型,因此我不能确定。

测试您的代码:

Func<string, Color, int, string> createLine 
    = ( label, color, pad ) 
    => ( "Label: " + label + " | pad: " + pad + " | Color: " + color.ToString( ) );

Console.WriteLine( createLine( "Test 1", Color.Red, 1 ) );
Console.WriteLine( createLine( "Test 2", Color.Green, 2 ) );
Console.WriteLine( createLine( "Test 3", Color.Blue, 3 ) );

我认为Chris Knight是对的,您的问题是您将返回值分配给与Line不同的类,并且会有其他代码更改您的颜色

哪些参数?硬编码和关闭的函数将保留在Func中,其他函数可以通过向Func传递不同的值进行修改。如果你能想出一个能说明其他情况的方法,那将对诊断问题非常有帮助。你能更好地描述一下发生了什么吗?似乎使用了哪些值?它们从何而来?以前的值在哪里?它们可能只是默认值吗?我认为这个问题中有太多的问题没有解决,最好的答案可能是否定的,Func没有理由这样做,错误在别处。这可能是一个与lambda捕获某些变量值有关的问题,但我不确定您上面发布的是否正是代码,或者,如果您将一些变量替换为常量,即Color.Pink而不是变量,则SSCCE不要求您保留GUI内容。你不能用终端输出来创建一个等价的代码路径吗?你的问题不是Charting.CreateLine,所以没有理由让它停留在这里。通常发生在我身上的事情是,我去做一个SSCCE,然后我发现为什么我的代码的其他部分出错了。我强烈推荐这个。对不起,这是个打字错误。ScoreLine是Line类型,在这两种情况下,作业都是为了ScoreLine。谢谢。我检查了分数线。整个分数线的颜色都是粉红色的。这种情况意味着行属性被GUI应用程序覆盖。
> Label: Test 1 | pad: 1 | Color: Color [Red] 
> Label: Test 2 | pad: 2 | Color: Color [Green] 
> Label: Test 3 | pad: 3 | Color: Color [Blue]