2010-07-07 159 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); 
} 
相关问题