代码之家  ›  专栏  ›  技术社区  ›  TN.

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

  •  7
  • TN.  · 技术社区  · 14 年前

    下面是一个例子:

    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中为泛型类型创建类型命名空间范围的类型别名,那就太好了。然后我会定义 酒吧 不是作为委托,而是将其定义为的命名空间范围别名 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 但是它不是命名空间范围的-对我的情况不太方便。

    编辑2:参见 comment by Joren 他建议,结构类型也可以解决这个问题。

    2 回复  |  直到 14 年前
        1
  •  9
  •   Eric Lippert    14 年前

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

    这是一个相当频繁请求的特性,它是它的要点。但这也是一个“很好拥有”的便利功能,而不是一个真正为语言增加了很多代表性力量的功能,这是反对它的。这样做是很好的,但它在优先事项列表中并不算太高。

        2
  •  0
  •   Ian Mercer    14 年前

    如果你…

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

    它可以为您确定类型,而不必显式地指定它们。

    (诚然,这不仅仅是一个解决方案,更是一项工作)