在使用 alias 指令的右侧键入别名

Type alias on right side of using alias directive

提问人:Peter - Reinstate Monica 提问时间:11/18/2014 最后编辑:Peter - Reinstate Monica 更新时间:11/18/2014 访问量:140

问:

我想做

namespace n
{
    using TupT = Tuple<TextBox, string, Func<bool>, string>;

    // Doesn't compile
    // using DicT = Dictionary<Button, TupT>;

    // Have to repeat tuple definition: cumbersome and error prone
    using DicT = Dictionary<Button, Tuple<TextBox, Func<bool>, string>>;
    // ...
}

此语言规范第 9.3.1 节禁止这样做:http://msdn.microsoft.com/en-us/library/aa664765%28v=vs.71%29.aspx。通常,类型别名对其他 using alias 指令不可见。(泛型实际上不是问题,但泛型经常出现别名需求,因为类型表示可能会变得复杂。

为什么会这样?

编辑:是的,我知道:我可以用无数种不同的方式做到这一点。但我特别想知道为什么我不能这样做;-)

C# using 指令

评论

1赞 juharr 11/18/2014
最好创建一个类来封装您放入其中的数据,以简化泛型和一般代码。Tuple
0赞 Patrick Hofman 11/18/2014
也许仅仅是因为他们认为不值得花时间?我认为副作用的数量和要解决的场景并不能权衡收益。
0赞 Peter - Reinstate Monica 11/18/2014
@PatrickHofman我可以很容易地想象,实际上在编译器中需要额外的实现努力才能禁止它。C 的 typedefs 似乎很容易实现。
0赞 Peter - Reinstate Monica 11/18/2014
@PatrickHofman 我从未实现过它,所以我不确定,但它似乎简单明了,并且与语言的其余部分正交。
0赞 George Polevoy 11/18/2014
我可以想象这是因为 C# 语言设计者希望尽可能多地避免奇怪,如果你向公众发布任何文档,这就是你会努力做的事情。

答:

0赞 Timothy Shields 11/18/2014 #1

我想这个限制只是为了排除在编译器中不必担心以下情况。

using X = C<Y>;
using Y = C<X>;
class C<T> { }

当然,问题是是......XC<Y>C<C<X>>C<C<C<Y>>>

如果语言限制比较宽松,只允许使用别名指令的循环,编译器可以处理它。我认为这只是一个优先级非常低的功能 - C# 语言团队只有这么多时间来设计和实现功能。

如果你发现自己经常使用 using alias 指令,这表明你的 common using alias 指令真的应该被制作成一个类。我敢肯定,它不像一个小小的四属性模型类那样具有描述性。Tuple<TextBox, string, Func<bool>, string>

评论

0赞 Peter - Reinstate Monica 11/18/2014
我确实同意你对简单课程的建议(你可能不相信,但它是我自己想到的)。但我是在 StackOverflow 上而不是在 CodeReview 上问这个问题,这是有原因的;-)。
0赞 Peter - Reinstate Monica 11/18/2014
至于周期性依赖问题:这在程序中可能发生很多情况,不是吗?编译器编写者必须始终捕获周期性依赖关系,例如struct T1 { T2 t2; }; struct T2 { T1 t1; }
0赞 Timothy Shields 11/18/2014
@PeterSchneider 这是完全正确的,但是在这种情况下,人们想要引用其他结构中的结构是极其普遍的。因此,对结构间引用的限制较少且仅检查循环依赖项的功能对 C# 语言团队具有很高的优先级。我可以保证没有任何深刻的哲学原因,使用别名指令不能相互引用。这只是一个未包含的功能。:)