提问人:Peter - Reinstate Monica 提问时间:11/18/2014 最后编辑:Peter - Reinstate Monica 更新时间:11/18/2014 访问量:140
在使用 alias 指令的右侧键入别名
Type alias on right side of using alias directive
问:
我想做
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 指令不可见。(泛型实际上不是问题,但泛型经常出现别名需求,因为类型表示可能会变得复杂。
为什么会这样?
编辑:是的,我知道:我可以用无数种不同的方式做到这一点。但我特别想知道为什么我不能这样做;-)
答:
0赞
Timothy Shields
11/18/2014
#1
我想这个限制只是为了排除在编译器中不必担心以下情况。
using X = C<Y>;
using Y = C<X>;
class C<T> { }
当然,问题是是......X
C<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# 语言团队具有很高的优先级。我可以保证没有任何深刻的哲学原因,使用别名指令不能相互引用。这只是一个未包含的功能。:)
评论
Tuple