Может ли свойство / поле класса иметь анонимный тип в C # 4.0? - PullRequest
8 голосов
/ 21 октября 2010

Как в:

public class MyClass {

  private static var MyProp = new {item1 = "a", item2 = "b"};

}

Примечание. Вышеприведенное не компилируется и не работает (вар не может быть использован), оно только показывает мою точку зрения.

Обновление : просто чтобы прояснить вопрос, я уже пытался использовать

private static dynamic MyProp = new {item1 = "a", item2 = "b"};

, и это работает, но оно не генерирует intellisense из-за динамической типизации.Я знаю, что анонимная типизация - это просто трюк компилятора, поэтому я надеялся, что смогу использовать этот трюк в своих интересах, объявив структурированное поле без предварительного объявления класса (главным образом потому, что будет только один экземпляр этого конкретногополе).Теперь я вижу, что это невозможно, но я не уверен, почему это так.Если компилятор просто генерирует неявный тип для анонимного объекта, то достаточно просто заставить компилятор сгенерировать этот неявный тип для поля.

Ответы [ 6 ]

11 голосов
/ 21 октября 2010

Похоже, вы могли бы задать один или два вопроса, поэтому я постараюсь ответить на оба.

Можно ли строго типизировать поле класса для анонимного типа

Нет. Имена анонимных типов нельзя указывать в коде C # (следовательно, анонимно). Единственный способ их статического ввода -

  1. Вывод общего типа
  2. Использование ключевого слова var

Ни один из них не применим к полю типа.

Можно ли инициализировать поле класса с помощью выражения анонимного типа?

Да. Просто нужно объявить поле для типа, совместимого с анонимными типами: object например

public class MyClass { 
  private static object MyProp = new {item1 = "a", item2 = "b"}; 
} 
5 голосов
/ 21 октября 2010

Нет, любой член должен быть строго типизирован.

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

Редактировать: Члены должны быть явно типизированы.

2 голосов
/ 21 октября 2010

Как насчет использования Tuple<string, string> вместо?

public class MyClass {

  private static Tuple<string, string> MyProp = Tuple.Create("a", "b");

}
2 голосов
/ 21 октября 2010

Если это C # 4, посмотрите ключевое слово dynamic.

public class MyClass 
{ 
  private static dynamic MyProp = new {item1 = "a", item2 = "b"}; 
} 

Однако, как только вы это сделаете, вы потеряете любые проверки безопасности типов и удобные проверки компилятором.

1 голос
/ 21 октября 2010

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

var myObj = new
{
    Foo = new { Name = "Joe", Age = 20 }
};

Но такая конструкция не имеет практического применения вне локальной области ...

0 голосов
/ 21 октября 2010

Нет, анонимные типы не могут быть открыты вне их декларирующей функции как что-либо кроме object. Хотя анонимный тип является просто синтаксическим сахаром и фактически создает конкретный тип, этот тип никогда не известен (и не доступен) разработчику и поэтому не может использоваться.

...