2014-11-24 2 views
1

Недавно я пытался проверить свои навыки для C# на Smarterer.с использованием {...} с новым для создания анонимного типа в C#

Я столкнулся с вопросом, который говорит, что из следующего можно использовать для создания анонимного типа в C# (что-то похожее).

Я выбрал «Ни один из этих» (я не помню других вариантов, поскольку это был тест на основе времени, который имел только 10 секунд).

Как только я дал ответ, он сказал, что правильный ответ {...}.

Так я думаю, что-то вроде этого:

var someVariableName = new {...}; создать анонимный тип.

Я удивлен, увидев это и немного попятился, но не смог найти ничего подобного.

Вопрос: Есть ли способ создать анонимный тип без объявления его типа при создании экземпляра с использованием ключевого слова или оператора {...}? или правильный ответ вопроса не был «правильным»?

Это может быть сделано с использованием ключевого слова dynamic, если я не ошибаюсь.

+2

В чем ваш вопрос? Поиск в Интернете для «C# new dynamic» дает, например, [Как динамический новый анонимный класс?] (Http://stackoverflow.com/questions/3740021/how-to-dynamic-new-anonymous-class), и да , 'var foo = new {bar =" baz "}', похоже, делает то, что вы хотите. – CodeCaster

+0

См. Http://stackoverflow.com/a/392163/1453076 – Vladimirs

+1

Итак, вы угадали 'new {...}', но они сказали, что это просто '{...}'? –

ответ

5

http://msdn.microsoft.com/en-GB/library/bb397696.aspx является MS documenation, процитировать:

создается анонимные типов с помощью нового оператора вместе с инициализатором объекта. Для получения дополнительной информации об инициализаторах объектов, см. Инициализаторы объектов и коллекций (Руководство по программированию на C#). В приведенном ниже примере показан анонимный тип, который инициализируется двумя объектами с именем Amount и Message.

C# 
var v = new { Amount = 108, Message = "Hello" }; 

Это не динамический тип, это определенный статический тип, который является «анонимным», т.е. вы не дали ему имя. Однако у компилятора есть/will, и поэтому v все еще строго типизирован, вы получаете intellisense и v.FieldIDontHave выдаст ошибку компилятора.

+0

Компилятор даже сопоставляет типы, имеющие одинаковые свойства одного и того же типа, в том же порядке, чтобы он мог повторно использовать существующий. Я не уверен, но я думаю, что я помню, как я видел билет, когда Рослин был выпущен, пытаясь изменить его, чтобы порядок свойств не имел значения, просто имя и тип, при сопоставлении «как для подобных» анонимных типов. –

1

Используйте ключевое слово вар

var x = new {value = 3, name = "lol"}; 
Console.WriteLine(x.value); //prints 3 
Console.WriteLine(x.name); //prints lol 
1

прошествию времени в комментариях, попадающей в нижней части этого вопроса, я могу подтвердить некоторые детали.

Ответ «Ответ», в котором указано, что только { MyProperty = 2 } был действительным синтаксисом для анонимного типа, является лишь половиной правильности. Синтаксис требуется, но требуется в сочетании с ключевым словом new.

var anon = new { Name = "Adam", Age = 29 }; 

Попытка следующее VS 2012 не будет компилироваться:

// Try and make an anonymous type without new. 
var anon = { Name = "Adam", Age = 29 }; 

// Try and declare an anonymous type prior to "newing" one up. 
{ Name = "Adam", Age = 29 }; 

Опять без точного вопроса и возможных ответов с другого сайта, то трудно представить контекст вопроса и последующего ответа на этот сайт. Надеюсь, этого достаточно, чтобы закрыть его.

+0

Спасибо, я собираюсь заняться этим испытанием умения дальше, и если я снова увижу этот вопрос, я собираюсь снять Скриншот и разместить его здесь.Но по крайней мере на основе текущей дискуссии я могу быть уверен, что я не могу инициализировать анонимный тип как «новый {...}» буквально. Спасибо всем !! И я также могу сообщить, что вопрос не содержит правильного ответа. – Jsinh

+0

Я бы сказал, педантично, что «новое» делает (как всегда) «неизменным» типа и как таковое {Name = «Adam», Age = 29} - это весь синтаксис, который можно считать содержащимся «определение типа», поэтому ответ «умнее» верен, хотя и не хватает деталей. Однако вся семантика. – tolanj

+0

@tolanj Ну, последнее не компилируется без первого, поэтому вопрос, пытающийся научить вас чему-то, что не компилирует и не утверждает, что это правильно, в значительной степени ошибочно ИМО, но да, без точной формулировки вопроса, {} 'часть - это то, что идентифицирует анонимный тип. –