Используя 'using alias = class' с универсальными типами? [дубликат]



этот вопрос уже есть ответ здесь:




  • Использование оператора с обобщениями: использование ISet = System.Коллекции.Родовой.Исеть>
    6 ответов



поэтому иногда я хочу включить только один класс из пространства имен, а не целое пространство имен, как в Примере здесь я создаю псевдоним для этого класса с помощью заявление:



using System;
using System.Text;
using Array = System.Collections.ArrayList;


Я часто делаю это с дженериками, так что мне не нужно повторять аргументы:



using LookupDictionary = System.Collections.Generic.Dictionary<string, int>;


Теперь я хочу сделать то же самое с универсальным типом, сохраняя его как универсальный тип:



using List<T> = System.Collections.Generic.List<T>;


но это не компилируется, так есть ли способ добиться создания этого псевдонима, оставляя тип как универсальный?

512   2  

2 ответов:

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

это описано в разделе 9.4.1 спецификации языка C#.

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

namespace N2
{
    using W = N1.A;         // Error, cannot name unbound generic type
    using X = N1.A.B;       // Error, cannot name unbound generic type
    using Y = N1.A<int>;    // Ok, can name closed constructed type
    using Z<T> = N1.A<T>;   // Error, using alias cannot have type parameters
}

как показано на http://msdn.microsoft.com/en-us/library/sf0df423.aspx и http://msdn.microsoft.com/en-us/library/c3ay4x3d%28VS.80%29.aspx, Вы можете сделать

using gen = System.Collections.Generic;
using GenList = System.Collections.Generic.List<int>;

и затем использовать

gen::List<int> x = new gen::List<int>;

или

GenList x = new GenList();

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

Я надеюсь, что C# в будущем будет обрабатывать псевдонимы, такие как методы расширения do with, и позволит вам определить многие из них в файле, который вы используете в другом месте, а затем поддерживать их в одном месте и скрывать внутренние ненужные сведения о сопоставлении типов от потребителей типов.

Comments

    Ничего не найдено.