2010-09-15 39 views
36

Vì tôi đang sử dụng hai không gian tên bộ sưu tập chung khác nhau (System.Collections.GenericIesi.Collections.Generic), tôi có xung đột. Trong các bộ phận khác của dự án, tôi đang sử dụng cả nunit và khung MSTest, nhưng đủ điều kiện mà khi tôi gọi Assert Tôi muốn sử dụng phiên bản nunit bởiSử dụng câu lệnh với Generics: sử dụng ISet <> = System.Collections.Generic.ISet <>

using Assert = NUnit.Framework.Assert; 

Những công trình vĩ đại, nhưng tôi muốn làm như vậy với các loại chung chung. Tuy nhiên, các dòng sau không hoạt động

using ISet = System.Collections.Generic.ISet; 
using ISet<> = System.Collections.Generic.ISet<>; 

Có ai biết cách nói .net cách sử dụng câu lệnh sử dụng với generics?

+3

Đây là một tính năng thường xuyên được yêu cầu. Nó nằm trong danh sách các tính năng có thể trong một thời gian dài, nhưng chưa bao giờ được ưu tiên đủ cao để thực sự thực hiện. –

+0

Eric, đây là lần đầu tiên tôi chạy qua vấn đề này, kể từ khuôn khổ .net 4.0 được thêm vào ISet <>, và các mục tiêu của Iesi.Collections dll 3.5. Thông thường các nhà phát triển khác là tốt về việc không xung đột với việc đặt tên .net chuẩn. –

+2

Tại sao bạn có nó trong hai không gian tên khác nhau? bạn có thể cung cấp thêm thông tin không? –

Trả lời

33

Tôi nghĩ tốt hơn là bạn nên tự đánh dấu các không gian tên như trái ngược với các loại chung chung (mà tôi không nghĩ là có thể).

Vì vậy, ví dụ:

using S = System.Collections.Generic; 
using I = Iesi.Collections.Generic; 

Sau đó cho một BCL ISet<int>, ví dụ:

S.ISet<int> integers = new S.HashSet<int>(); 
+0

Đề xuất rất hay! – julealgon

+0

Điều đó chỉ hoạt động nếu đó là không gian tên dài, nếu các tham số kiểu của chúng có tên kiểu dài thì bạn sẽ không gặp may. –

6

Cách duy nhất bạn có thể bí danh một kiểu generic là chuyên nó như sau.

using IntSet = System.Collections.Generic.ISet<int>; 

Bạn không thể bí danh một kiểu generic mở như bạn đã làm trong ví dụ của bạn:

using MySet = System.Collections.Generic.ISet<>; 
+0

Cảm ơn Steve, tôi sẽ có thể sử dụng sau này! –

+0

Tại sao ví dụ đầu tiên của bạn sẽ không biên dịch trên VS2017? – mr5

3

tên bí danh của bạn là giống như tên lớp chính nó, vì vậy bạn vẫn có sự mơ hồ, giống như nếu bạn có một using cho mỗi không gian tên. Cung cấp cho các bí danh của lớp một khác nhau tên, tức là .:

using FirstNamespace; 
using OtherObject = SecondNamespace.MyObject; 

public class Foo 
{ 
    public void Bar() 
    { 
     MyObject first = new MyObject;//will be the MyObject from the first namespace 
     OtherObject second = new OtherObject; 
    } 
} 
0

Bạn có thể bí danh một lớp đang làm:

using Test = NameSpace.MyClass; 

Chỉ khi lớp là không chung chung.

+4

Bạn * có thể * bí danh một lớp chung, bạn chỉ cần phải xác định một loại cụ thể trong bí danh, thay vì để nó chung chung. – Servy

33

Thật không may, chỉ thị using không làm những gì bạn muốn. Bạn có thể nói:

using Frob = System.String; 

using ListOfInts = System.Collections.Generic.List<System.Int32>; 

nhưng bạn không thể nói

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

hoặc

using Blob = System.Collections.Generic.List 

Đó là một thiếu sót của ngôn ngữ mà chưa bao giờ được sửa chữa.

+0

Cách tốt nhất để vận động hành lang cho tính năng này là gì? – miniBill

+0

@miniBill: Thử đăng bài lên diễn đàn thiết kế ngôn ngữ tại Roslyn.codeplex.com. –

0

Trong một số trường hợp, bạn có thể đi với thừa kế:

public class MyList<T1, T2> : List<Tuple<IEnumerable<HashSet<T1>>, IComparable<T2>>> { } 

    public void Meth() 
    { 
     var x = new MyList<int, bool>(); 
    } 
Các vấn đề liên quan