2017-06-23 14 views
0

我真的不知道該如何解釋這一點,但我已經嘗試了一些事情,他們不工作的時候。基本上我想要一個項目的行動,行動有點像項目功能。這是我的代碼,它不是先進的。C#設置操作等於拉姆達但有拉姆達保持可變覆蓋

class Item 
{ 
    private int itemCount; 
    private Action itemUsage; 
    string name; 

    //Item.Item() 
    public Item(string _name, Action _itemUsage, int _itemCount) 
    { 
     name = _name; 
     itemUsage = _itemUsage; 
     itemCount = _itemCount; 

     //laterInvokes itemUsage 
    } 

    //Item.UseItem 
    public void UseItem() 
    { 
     //TYPE:ACTION, is set in constructor 
     this.itemUsage(); 
    } 
} 

而且。

class Program 
{ 
    //Program.Main(string[] args) 
    public static void Main(string[] args) 
    { 
     Item[] items = new Item[11]; 

     //for every item in items; 
     for (int i = 0; i < items.Length; i++) 
     { 
      //How do i save 'a's lambda with out it coming back here? 
      Action a =() => Console.WriteLine("Used Item " + i); 
      items[i] = new Item("Item " + i, a, 1); 
     } 

     items[0].UseItem(); 
     items[3].UseItem(); 
     items[4].UseItem(); 
     items[7].UseItem(); 
     //Expect result; 
     //"Used Item 0" 
     //"Used Item 2" 
     //"Used Item 3" 
     //"Used Item 7" 

     //Actual Result 
     //"Used Item 5" 
     //"Used Item 5" 
     //"Used Item 5" 
     //"Used Item 5" 

     Console.ReadLine(); 
    } 


} 

問題,因爲我可以看到它是我變量不保存在lambda中。

Action a =() => Console.WriteLine("Used Item " + i); 

所以每當我叫項[X] .UseItem()它可以追溯到裏面的for循環操作的聲明和「使用」的我有現在是5

+0

什麼?再一次呢? –

+0

好的...我想我現在得到了你...嘗試下面的''var temporaryInt = i;行動=()=> Console.WriteLine( 「二手物品」 + temporaryInt);「'' –

+0

謝謝你這只是那些時刻之一 –

回答

1

如果運行你的代碼,你沒有得到Used Item 5,但這:

Used Item 11 
Used Item 11 
Used Item 11 
Used Item 11 

,這是意料之中的,因爲items.Length等於11

每次代碼編譯

Action a =() => Console.WriteLine("Used Item " + i); 

a被「更新」與Console.WriteLine("Used Item " + i);用的for循環當前i,其最後的值是11,所以在循環結束時,您有

a =() => Console.WriteLine("Used Item " + 11); 

爲定義的每個a

爲了避免這種(通用)的錯誤,你需要實現一個臨時變量,如建議由蘭德隨機:

var temp = i; 
Action a =() => Console.WriteLine("Used Item " + temp);