Hãy có một ví dụ sau:Namespace scoped bí danh với nhiều loại generic trong C#
public class X { }
public class Y { }
public class Z { }
public delegate IDictionary<Y, IList<Z>> Bar(IList<X> x, int i);
public interface IFoo
{
// ...
Bar Bar { get; }
}
public class Foo : IFoo
{
// ...
public Bar Bar
{
get
{
return null; //...
}
}
}
void Main()
{
IFoo foo; //= ...
IEnumerable<IList<X>> source; //= ...
var results = source.Select(foo.Bar); // <- compile error here
}
Trình biên dịch nói:
Những lập luận kiểu cho phương pháp 'System.Linq.Enumerable.Select (Hệ thống .Collections.Generic.IEnumerable, System.Func) 'không thể được suy ra từ mức sử dụng. Hãy thử chỉ định các đối số loại một cách rõ ràng.
Đó là vì, nó không thể chuyển đổi Bar
thành Func<IList<X>, int, IDictionary<Y, IList<Z>>>
.
Sẽ thật tuyệt nếu tôi có thể tạo bí danh loại phạm vi kiểu không gian tên cho các loại chung trong C#. Sau đó, tôi sẽ xác định Bar
không phải là một đại biểu, nhưng thay vào đó tôi sẽ xác định nó như là một bí danh phạm vi không gian tên cho Func<IList<X>, int, IDictionary<Y, IList<Z>>>
.
public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>;
Sau đó tôi có thể xác định bí danh phạm vi không gian tên cho ví dụ: IDictionary<Y, IList<Z>>
.
Và nếu được sử dụng một cách thích hợp :), nó sẽ làm cho mã dễ đọc hơn. Bây giờ, tôi phải nội tuyến các loại chung chung và mã thực không thể đọc được: (
Bạn có gặp rắc rối tương tự không :)? Có lý do chính đáng nào tại sao nó không có trong C# 3.0 không? Hoặc không có lý do chính đáng, nó chỉ là vấn đề tiền bạc và/hoặc thời gian?
EDIT: Tôi biết rằng tôi có thể sử dụng using
, nhưng nó không phải là không gian tên phạm vi - không thuận tiện cho trường hợp của tôi.
EDIT2: Xem comment by Joren nơi ông đề xuất rằng việc nhập cấu trúc cũng có thể giải quyết được sự cố.
Tôi không chắc vấn đề với 'using' là - được cấp nó không định nghĩa một kiểu mới, nhưng không phải là những gì bạn muốn? –
Như tôi đã viết, nó không phải là không gian tên scoped, nhưng thay vì tập tin scoped. Tôi cần sử dụng bí danh trên các tệp cs và các hội đồng. –