【问题标题】:Lambda function in C# behaves weirdlyC# 中的 Lambda 函数行为怪异
【发布时间】:2015-10-09 15:04:51
【问题描述】:

代码的原因可能是什么

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 中,其他可以通过将不同的值传递给Func 来修改。如果你能想出一个SSCCE 来证明不是这样,那将非常有助于诊断问题。
  • 你能更好地描述发生了什么吗?似乎使用了哪些值?他们从哪里来?
  • 以前的值在哪里?有可能它们只是默认值吗?我认为有太多事情不在这个问题中——最好的答案可能只是“不,Func 没有理由这样做,而错误在其他地方”。跨度>
  • 这可能是与捕获某些变量值的 lambda 有关的问题,但我不确定您上面发布的内容是否完全代码,或者您是否替换了一些常量的变量(即Color.Pink 而不是变量)。
  • SSCCE 不要求您保留 GUI 内容。你不能只用终端输出制作一个等效的代码路径吗?您的问题与Charting.CreateLine 无关,因此没有理由坚持下去。通常发生在我身上的是我去制作一个 SSCCE,然后我发现为什么我的代码的其他部分在这样做时出错了。我强烈推荐这个。

标签: c# lambda


【解决方案1】:

测试你的代码:

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 ) );

你应该看到这个:

> Label: Test 1 | pad: 1 | Color: Color [Red] 
> Label: Test 2 | pad: 2 | Color: Color [Green] 
> Label: Test 3 | pad: 3 | Color: Color [Blue]

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

【讨论】:

  • 谢谢。在Line 的整个生命周期中,我检查了ScoreLine.Color 是否为Pink。这种情况意味着线条属性被 GUI 应用程序覆盖。
【解决方案2】:

我在不知道这些图表内容是什么的情况下看到的一件事是,您的 Func&lt;string, Color, int, Line&gt; 说它返回一个 Line,但是在使用 lambda 时,您将方法调用的结果分配给了 ScoreLine。在您的非 lambda 示例中,您将结果分配给 Line。这可能是个问题吗?你不是说ScoreLineLine的类型是什么,所以我不能确定。

【讨论】:

  • 抱歉,打错了。 ScoreLineLine 类型,在这两种情况下,分配都是为了 ScoreLine
猜你喜欢
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2011-06-23
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多