2014-12-02 53 views
0

我只是碰到下面的代碼來:VAR沒有得到內含價值

public void ListControls(ControlCollection controls, List<Control> controlsFound) 
{ 
    foreach (var control in controls) 
    { 
     if (control is IAttributeAccessor) 
     { 
      controlsFound.Add(control); //Error (Invalid argument to Add method) 
      ListControls(control.Controls, controlsFound); 
     } 
    } 
} 

它給出了一個錯誤如上:

如果我在foreachControl改變var然後它工作。原因是Add方法期望Control作爲參數。但我認爲var應該已經被Control隱含地取代了,對吧?

+2

' ControlCollection'沒有實現'IEnumerable ' – leppie 2014-12-02 12:34:38

回答

4

不,它不因爲ControlCollection僅實現非通用IEnumerable不是一般IEnumerable<Control>所以當你歷數它不提供類型,你會得到object

+0

因爲它是一個ControlCollection,它必須具有Control的集合,並且應該已經知道編譯器,爲什麼它不是這樣? – Imad 2014-12-02 12:53:05

+0

@Imad編譯器知道一個集合包含'T'類型的項目,*如果該集合實現'IEnumerable '。 'ControlCollection'沒有實現那個接口,所以編譯器不知道這些項是哪一種。 – dcastro 2014-12-02 12:56:18

+1

*您*由於名稱的原因,推斷出'ControlCollection'包含'Control'的實例。但編譯器將如何知道? – dcastro 2014-12-02 12:57:51

1

使用LINQ將工作:

public void ListControls(ControlCollection controls, List<Control> controlsFound) 
    { 
     foreach (var control in controls.OfType<Control>()) 
     { 
      if (control is IAttributeAccessor) 
      { 
       controlsFound.Add(control); //Error (Invalid argument to Add method) 
       ListControls(control.Controls, controlsFound); 
      } 
     } 
    } 
+0

嗯,有點LINQ,因爲IEnumerable的擴展方法(http://msdn.microsoft.com/en-us/library/vstudio/bb360913%28v=vs.100%29.aspx)是在'System.LINQ'命名空間中,但是調用這個「LINQ」有點讓人誤解。 – Jamiec 2014-12-02 12:43:39