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

时间:2010-04-07 07:23:31

标签: c# generics delegates alias structural-typing

让我们举一个例子:

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
}

编译器说:

  

方法的类型参数   “System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,   System.Func)'不能   从用法推断。尝试   指定类型参数   明确。

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

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

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

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

如果使用得当:),它将使代码更具可读性。现在,我必须内联泛型类型,并且实际代码不易读取:(

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

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

EDIT2:请参阅comment by Joren,他建议结构打字也可以解决问题。

2 个答案:

答案 0 :(得分:9)

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

这是一个经常被请求的功能,这是它的要点。但它也是一种“很好的”便利功能,而不是真正为语言添加许多代表性功能的功能,这是对它的反对。这样做会很好,但在优先级列表中并不是很高。

答案 1 :(得分:0)

如果你这样做......

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

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

(无可否认,这不仅仅是一种解决方案而非解决方案)

相关问题