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

2024-02-24

让我们看一个下面的例子:

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 to 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,但它不是命名空间范围的 - 对于我的情况来说不太方便。

编辑2:参见乔伦的评论 https://stackoverflow.com/questions/2590643#comment-2603245他建议结构类型也可以解决这个问题。


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

这是一个相当频繁请求的功能,这是它的要点。但它也是一个“很高兴拥有”的便利功能,而不是真正为语言增加大量表征能力的功能,这是它的缺点。这样做固然很好,但它在优先级列表上并不是很高。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中泛型类型的命名空间范围别名 的相关文章

随机推荐