C#中generics类型的命名空间范围别名

让我们举个例子:

public class X { } public class Y { } public class Z { } public delegate IDictionary<Y, IList> Bar(IList 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> source; //= ... var results = source.Select(foo.Bar); // <- compile error here } 

编译器说:

无法从用法中推断出方法’System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)’的类型参数。 尝试显式指定类型参数。

这是因为,它无法将Bar转换为Func<IList, int, IDictionary<Y, IList>>

如果我可以在C#中为generics类型创建类型命名空间作用域类型别名,那将是很好的。 然后我将Bar定义为委托,而是将其定义为Func<IList, int, IDictionary<Y, IList>>的命名空间作用域别名。

 public alias Bar = Func<IList, int, IDictionary<Y, IList>>; 

然后我还可以为例如IDictionary<Y, IList>定义名称空间作用域别名。

如果使用得当:),它将使代码更具可读性。 现在,我必须内联generics类型,真正的代码不是很好阅读:(

你有同样的麻烦:)? 有什么理由不在C#3.0中吗? 或者没有充分的理由,这只是金钱和/或时间的问题?

编辑:我知道我可以使用,但它不是命名空间范围 – 对我的情况不太方便。

编辑2:请参阅Joren的评论 ,他建议结构类型也可以解决问题。

你运气不好; using指令仅影响其当前文件。 没有名称空间范围的类型别名机制。

这是一个相当频繁的请求function,这是它的要点。 但它也是一种“很好的”便利function,而不是真正为语言添加许多代表性function的function,这是对它的反对。 这样做会很好,但它在优先级列表上并不是很高。

如果你这样做……

 var results = source.Select((x, i) => foo.Bar(x, i)); 

它可以为您找出类型而无需明确指定它们。

(不可否认,这更像是解决方案而不是解决方案)