• <small id='UeLqU'></small><noframes id='UeLqU'>

  • <i id='UeLqU'><tr id='UeLqU'><dt id='UeLqU'><q id='UeLqU'><span id='UeLqU'><b id='UeLqU'><form id='UeLqU'><ins id='UeLqU'></ins><ul id='UeLqU'></ul><sub id='UeLqU'></sub></form><legend id='UeLqU'></legend><bdo id='UeLqU'><pre id='UeLqU'><center id='UeLqU'></center></pre></bdo></b><th id='UeLqU'></th></span></q></dt></tr></i><div id='UeLqU'><tfoot id='UeLqU'></tfoot><dl id='UeLqU'><fieldset id='UeLqU'></fieldset></dl></div>

    • <bdo id='UeLqU'></bdo><ul id='UeLqU'></ul>
    <tfoot id='UeLqU'></tfoot>
  • <legend id='UeLqU'><style id='UeLqU'><dir id='UeLqU'><q id='UeLqU'></q></dir></style></legend>

        在 lambda 表达式中使用 foreach 循环的迭代器变量

        时间:2023-08-28
          • <bdo id='Qp7fM'></bdo><ul id='Qp7fM'></ul>
            1. <legend id='Qp7fM'><style id='Qp7fM'><dir id='Qp7fM'><q id='Qp7fM'></q></dir></style></legend>
            2. <i id='Qp7fM'><tr id='Qp7fM'><dt id='Qp7fM'><q id='Qp7fM'><span id='Qp7fM'><b id='Qp7fM'><form id='Qp7fM'><ins id='Qp7fM'></ins><ul id='Qp7fM'></ul><sub id='Qp7fM'></sub></form><legend id='Qp7fM'></legend><bdo id='Qp7fM'><pre id='Qp7fM'><center id='Qp7fM'></center></pre></bdo></b><th id='Qp7fM'></th></span></q></dt></tr></i><div id='Qp7fM'><tfoot id='Qp7fM'></tfoot><dl id='Qp7fM'><fieldset id='Qp7fM'></fieldset></dl></div>
                <tbody id='Qp7fM'></tbody>
              <tfoot id='Qp7fM'></tfoot>

                <small id='Qp7fM'></small><noframes id='Qp7fM'>

                  本文介绍了在 lambda 表达式中使用 foreach 循环的迭代器变量 - 为什么会失败?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  考虑以下代码:

                  公共类 MyClass{公共委托字符串 PrintHelloType(字符串问候语);公共无效执行(){Type[] types = new Type[] { typeof(string), typeof(float), typeof(int)};列表<PrintHelloType>helloMethods = 新列表<PrintHelloType>();foreach(类型中的 var 类型){var sayHello =new PrintHelloType(greeting => SayGreetingToType(type, greeting));helloMethods.Add(sayHello);}foreach(helloMethods 中的 var helloMethod){Console.WriteLine(helloMethod("Hi"));}}public string SayGreetingToType(Type type, string greetingText){返回 greetingText + " " + type.Name;}...}

                  调用myClass.Execute()后,代码打印出以下意外响应:

                  <上一页>嗨 Int32嗨 Int32嗨 Int32

                  显然,我希望 "Hi String""Hi Single""Hi Int32",但显然不是案件.为什么在所有 3 种方法中都使用迭代数组的最后一个元素而不是适当的方法?

                  您将如何重写代码以实现预期目标?

                  解决方案

                  欢迎来到闭包和捕获变量的世界:)

                  Eric Lippert 对此行为有深入的解释:

                  • 结束在被认为有害的循环变量上
                  • 结束在循环变量上,第二部分

                  基本上,捕获的是循环变量,而不是值.要获得您认为应该获得的东西,请执行以下操作:

                  foreach (var type in types){var newType = 类型;var sayHello =new PrintHelloType(greeting => SayGreetingToType(newType, greeting));helloMethods.Add(sayHello);}

                  Consider the following code:

                  public class MyClass
                  {
                     public delegate string PrintHelloType(string greeting);
                  
                  
                      public void Execute()
                      {
                  
                          Type[] types = new Type[] { typeof(string), typeof(float), typeof(int)};
                          List<PrintHelloType> helloMethods = new List<PrintHelloType>();
                  
                          foreach (var type in types)
                          {
                              var sayHello = 
                                  new PrintHelloType(greeting => SayGreetingToType(type, greeting));
                              helloMethods.Add(sayHello);
                          }
                  
                          foreach (var helloMethod in helloMethods)
                          {
                              Console.WriteLine(helloMethod("Hi"));
                          }
                  
                      }
                  
                      public string SayGreetingToType(Type type, string greetingText)
                      {
                          return greetingText + " " + type.Name;
                      }
                  
                  ...
                  
                  }
                  

                  After calling myClass.Execute(), the code prints the following unexpected response:

                  Hi Int32
                  Hi Int32
                  Hi Int32  
                  

                  Obviously, I would expect "Hi String", "Hi Single", "Hi Int32", but apparently it is not the case. Why the last element of the iterated array is being used in all the 3 methods instead of the appropriate one?

                  How would you rewrite the code to achieve the desired goal?

                  解决方案

                  Welcome to the world of closures and captured variables :)

                  Eric Lippert has an in-depth explanation of this behaviour:

                  • Closing over the loop variable considered harmful
                  • Closing over the loop variable, part two

                  basically, it's the loop variable that is captured, not it's value. To get what you think you should get, do this:

                  foreach (var type in types)
                  {
                     var newType = type;
                     var sayHello = 
                              new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
                     helloMethods.Add(sayHello);
                  }
                  

                  这篇关于在 lambda 表达式中使用 foreach 循环的迭代器变量 - 为什么会失败?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:使用 PhysicalAddress 作为键时字典中的重复键 下一篇:C# 或滑动窗口枚举器中的成对迭代

                  相关文章

                  最新文章

                    <bdo id='5mmAl'></bdo><ul id='5mmAl'></ul>

                    <small id='5mmAl'></small><noframes id='5mmAl'>

                    <tfoot id='5mmAl'></tfoot>
                    1. <i id='5mmAl'><tr id='5mmAl'><dt id='5mmAl'><q id='5mmAl'><span id='5mmAl'><b id='5mmAl'><form id='5mmAl'><ins id='5mmAl'></ins><ul id='5mmAl'></ul><sub id='5mmAl'></sub></form><legend id='5mmAl'></legend><bdo id='5mmAl'><pre id='5mmAl'><center id='5mmAl'></center></pre></bdo></b><th id='5mmAl'></th></span></q></dt></tr></i><div id='5mmAl'><tfoot id='5mmAl'></tfoot><dl id='5mmAl'><fieldset id='5mmAl'></fieldset></dl></div>
                    2. <legend id='5mmAl'><style id='5mmAl'><dir id='5mmAl'><q id='5mmAl'></q></dir></style></legend>