2010-07-07 458 views
4

我試圖做下面的事情,但它不起作用。爲什麼.NET不會讓我這樣做?爲什麼我無法將匿名類型作爲參數傳遞給函數?

private void MyFunction(var items) 
{ 
//whatever 
} 
+2

只是FYI,用'var'定義的變量是隱式類型的,而不是匿名的。匿名類型是完全不同的球類遊戲。 'var'可以與匿名類型一起使用,但並不意味着對象*是*匿名類型。 – Nate 2010-07-07 21:48:33

回答

7

在Visual C#3.0開始,那些在方法範圍聲明的變量可以具有隱式類型變種。一個隱式類型的局部變量是強類型的,就像你自己聲明瞭類型一樣,但是編譯器決定了類型。我的下面兩個聲明在功能上等同:

var i = 10; // implicitly typed 
int i = 10; //explicitly typed 

。換句話說,var關鍵字只適用於局部範圍的變量。

Source

一點點更多信息here。基本上,在使用var時,還必須將變量初始化爲同一行上的值,以便編譯器知道它是什麼類型。

+0

我不知道動態關鍵字在這裏有什麼用處... – 2012-05-30 13:50:39

+1

@VincentVancalbergh我認爲'動態'會提供OP之後的使用。 – Nate 2012-05-30 13:53:24

1

C#是一種強類型語言,匿名類型的添加並沒有改變這一點。

你當然可以通過類型對象(或對象數組)的函數的變量,

private void MyFunction(object items) 
{ 
    //Typecast to whatever you like here....But frankly this is a "code smell" 
} 

也許你能告訴我們你想達到什麼目的,也許有更好的設計。

2

嚴格地說,你可以傳遞匿名類型作爲參數,但是你不能以強類型的方式訪問它的成員。使用泛型類型參數推斷:

public static int Foo<T>(T obj) 
{ 
    return obj.GetHashCode(); 
} 

public static void Main() 
{ 
    var anonymousType = new { Id = 2, Name = "Second" }; 
    var value = Foo(anonymousType); 
} 
相關問題