В C # 3.0 мы используем «var», какова его альтернатива в C # 2.0? - PullRequest
2 голосов
/ 13 мая 2009

Я изучаю подключаемую архитектуру в .Net, используя Managed Extensibility Framework (MEF.) Я видел пример кода в сети, но когда я попытался реализовать его, я застрял в одной точке.

Код использовался:

 var catalog = new AttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly());
 var container = new CompositionContainer(catalog.CreateResolver());

Это var доступно на C # 3.0, где я кодирую в C # 2.0.

Какая альтернатива приведенным выше двум утверждениям? Как я могу заставить их работать в c # 2.0, используя VS 2005?


Я попробовал это, как говорится

Ошибка 1 Не удалось найти тип или имя пространства имен AttributedAssemblyPartCatalog (отсутствует директива using или ссылка на сборку?) C: \ Documents and Settings \ test \ Desktop \ MEFDemo \ MEFDemo \ Program.cs 31 13 MEFDemo

где я добавил ссылку на SystemComponentModel.Composition

Ответы [ 6 ]

11 голосов
/ 13 мая 2009

По сути, var заставляет компилятор определять (выводить) тип переменной времени компиляции на основе ее "инициализатора" - фактически, выражение справа от знака = , Здесь типы очевидны:

AttributedAssemblyPartCatalog catalog = 
    new AttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly());
CompositionContainer container = 
    new CompositionContainer(catalog.CreateResolver());

И убедитесь, что вы добавили оператор using System.ComponentModel.Composition;. Кроме того, имейте в виду, что AttributedAssemblyPartCatalog был переименован в AssemblyCatalog.

1 голос
/ 13 мая 2009

Это использование вывода типа в C # 3.0.

При использовании ключевого слова

var

в c # 3.0 компилятор выводит тип. См. объяснение Скотта Гатри

В c # 2.0 вы должны объявить тип переменной так же, как c # 1.1

например.

Type variableName = new Type();

Пример кода выше

AttributedAssemblyPartCatalog catalog = new AttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly());

CompositionContainer container = new CompositionContainer(catalog.CreateResolver());

НТН

1 голос
/ 13 мая 2009

Переменные в C # по-прежнему строго типизированы. var неявная типизация - см. MSDN .

В большинстве случаев это просто означает, что вам нужно печатать меньше, но в некоторых случаях это необходимо - во втором примере на странице, на которую я ссылаюсь:

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

1 голос
/ 13 мая 2009
AttributedAssemblyPartCatalog catalog = new 
    AttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly());

CompositionContainer container = new 
    CompositionContainer(catalog.CreateResolver());
0 голосов
/ 13 мая 2009

MEF использует LINQ, поэтому для него требуется .NET 3.5. Вам не повезет, если вы попытаетесь использовать его в .NET 2.0.

0 голосов
/ 13 мая 2009

var является ключевым словом C # 3.0 и не делает ничего, кроме вывода строгого типа из значения инициализации.

В отсутствие var вы вручную делаете то, что компилятор делает за кулисами; Вы указываете тип переменной в объявлении.

Следовательно,

AttributedAssemblyPartCatalog catalog = new 
    AttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly());

CompositionContainer container = new 
    CompositionContainer(catalog.CreateResolver());
...