Pertanyaan Menggunakan 'menggunakan alias = kelas' dengan tipe generik? [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Jadi kadang-kadang saya ingin hanya memasukkan satu kelas dari namespace daripada seluruh namespace, seperti contoh di sini saya membuat alias ke kelas tersebut dengan pernyataan yang digunakan:

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

Saya sering melakukan ini dengan obat generik sehingga saya tidak perlu mengulang argumen:

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

Sekarang saya ingin mencapai hal yang sama dengan tipe generik, sambil mempertahankannya sebagai tipe generik:

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

Tapi itu tidak dapat dikompilasi, jadi adakah cara untuk membuat alias ini sementara meninggalkan jenis sebagai generik?


75
2018-02-08 18:38


asal


Jawaban:


Tidak, tidak ada. Tipe alias dalam C # haruslah tipe tertutup (alias terselesaikan sepenuhnya) sehingga generik terbuka tidak didukung

Ini tercakup dalam bagian 9.4.1 dari spesifikasi Bahasa C #.

Menggunakan alias dapat menamai jenis yang dibangun tertutup, tetapi tidak dapat menyebutkan jenis generik yang tidak terikat deklarasi tanpa memberikan argumen tipe.

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



seperti yang ditunjukkan pada http://msdn.microsoft.com/en-us/library/sf0df423.aspx dan http://msdn.microsoft.com/en-us/library/c3ay4x3d%28VS.80%29.aspx, Anda dapat melakukan

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

lalu gunakan

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

atau

GenList x = new GenList();

namun Anda harus mereplikasinya menggunakan definisi di setiap file di mana Anda menggunakannya, jadi jika Anda membuat beberapa perubahan pada mereka di masa depan dan lupa untuk memperbarui di setiap file, semuanya akan rusak parah.

Saya harap C # di masa depan Akan memperlakukan alias seperti yang dilakukan dengan metode ekstensi dan membiarkan Anda mendefinisikan banyak dari mereka dalam file yang Anda gunakan di tempat lain, kemudian mempertahankannya di satu tempat dan menyembunyikan detail pemetaan jenis internal yang tidak perlu dari jenis konsumen.


5
2017-07-04 19:12