是否可以在C#中定义参数化类型别名?

时间:2011-07-23 01:08:18

标签: c# generics

C#文档建议使用using指令将类型放入本地范围。的确,我可以这样做:

using DD = IDictionary<string,IDictionary<string,Blah>>;

它工作正常。但是,我希望能够做到:

using DD<Blah> = IDictionary<string,IDictionary<string,Blah>>

但编译器死于:

using DD<Blah...
        ^ ; expected

有没有办法表达这种类型的同义词,而不是在整个地方重复可怕的长通用名称?

上下文

我想知道是否可以在只读集合的​​输出类型上编写通用的递归包装器。使用以下界面

interface IIndexable<in In, out Out> { Out this[In idx] { get; }}

我设法写了

IIndexable<Key,VOut> map(IIndexable<Key,VIn> coll, Func<VIn, VOut> f)

我想我真的想模仿Haskell的Functor类型类的便利性。

因此,将我的复杂类型包装在自定义类中不会削减它,因为它是从map()的堆栈组装而且没有单个new调用来替换自定义包装器类。

2 个答案:

答案 0 :(得分:3)

最好为IDictionary<string, Blah>引入自己的类型,至少为了便于阅读。

最简单的class MyDic : Dictionary<string, Blah> {}会去。你没有别名和长名。只需IDictionary<string, MyDic>

如果要完全回答你的问题。不,C#要求您完全限定别名。

答案 1 :(得分:3)

可悲的是,没有。您必须为每个Blah类型定义一个别名(在您的示例中)。

像:

using DB = IDictionary<string,IDictionary<string,Blah>>;
using DG = IDictionary<string,IDictionary<string,Gah>>;

我知道,有点令人沮丧。

但是,我建议您考虑一下是否希望代码首先处理的变量是IDictionary<string, IDictionary<string, Blah>>。当你'重新嵌套这样的数据结构,现在是时候问问自己是否应该在自定义类中封装其中一些实际上可以轻松做到你想要的而不会让自己头疼。当然,可能是你我特意问这个问题,因为你正在写这样一个类,在这种情况下,继续。)