2010-07-07 2 views
4

Я пытался сделать что-то вроде ниже, но это не работает. Почему .NET не позволит мне это сделать?Почему я не могу передать анонимный тип в качестве параметра функции?

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

Просто FYI переменные, определенные с помощью 'var', неявно напечатаны, а не анонимны. Анонимные типы - совершенно другая игра в мяч. 'var' может использоваться с анонимными типами, но это не означает, что объект * является * анонимным типом. – Nate

ответ

7

Начиная с Visual C# 3.0, переменные, объявленные в методе сферы могут иметь неявный тип вар. Неявно типизированная локальная переменная строго типизирована так же, как если бы вы объявили тип самостоятельно, но компилятор определяет тип. Следующие два заявления I функционально эквивалентны:

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

В других случаях, var ключевое слово разрешается только локально контекстные переменные.

Source.

Немного больше информации here. В принципе, при использовании var вы также должны инициализировать переменную до значения в той же строке, чтобы компилятор знал, какой тип он есть.

+0

Интересно, будет ли здесь использовать любое ключевое слово dynamic ... –

+1

@VincentVancalbergh Я думаю, что 'dynamic' обеспечит использование этого OP. – Nate

1

C# - строго типизированный язык, добавление анонимных типов не изменило этого.

Конечно, можно передать переменную типа объекта (или массив объектов) к функции,

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

Может быть, вы могли бы сказать нам, что вы пытаетесь достичь, может быть, есть лучший дизайн.

2

Строго говоря, вы можете передавать анонимный тип в качестве аргумента, но вы не можете получить к нему доступ строго типизированным способом. Используйте аргумент типа generic:

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); 
} 
Смежные вопросы