Frage Verwenden Sie eine 'using alias = class' mit generischen Typen? [Duplikat]


Diese Frage hat hier bereits eine Antwort:

Manchmal möchte ich also nur eine Klasse aus einem Namespace und nicht aus einem ganzen Namespace einbeziehen. Wie im Beispiel hier erstelle ich mit der using-Anweisung einen Alias ​​für diese Klasse:

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

Ich mache das oft mit Generika, damit ich die Argumente nicht wiederholen muss:

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

Jetzt möchte ich dasselbe mit einem generischen Typ erreichen, während ich es als generischen Typ behalte:

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

Aber das kompiliert nicht, gibt es also eine Möglichkeit, diesen Alias ​​zu erstellen, während der Typ als generisch bleibt?


75
2018-02-08 18:38


Ursprung


Antworten:


Nein, da ist kein. Ein Typalias in C # muss ein geschlossener (auch vollständig aufgelöster) Typ sein, damit offene Generika nicht unterstützt werden

Dies wird in Abschnitt 9.4.1 der C # -Sprachspezifikation behandelt.

Aliasnamen können einen geschlossenen konstruierten Typ, aber kann keinen ungebundenen generischen Typ nennen Deklaration ohne Angabe von Typargumenten.

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
}

77
2018-02-08 18:39



wie gezeigt bei http://msdn.microsoft.com/en-us/library/sf0df423.aspx und http://msdn.microsoft.com/en-us/library/c3ay4x3d%28VS.80%29.aspx, du kannst tun

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

und dann benutzen

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

oder

GenList x = new GenList();

Allerdings müssen Sie diejenigen, die Definitionen verwenden, in jeder Datei, in der Sie sie verwenden, replizieren. Wenn Sie also in Zukunft Änderungen daran vornehmen und vergessen, bei jeder Datei zu aktualisieren, werden die Dinge schlecht abschneiden.

Ich hoffe, dass C # in der Zukunft Aliases wie die Do mit Extension-Methoden behandeln wird und Sie viele davon in einer Datei definieren können, die Sie woanders verwenden, dann an einer Stelle pflegen und die internen unnötigen Typ-Mapping-Details vom Typ Consumers ausblenden.


5
2017-07-04 19:12