为什么一个别名的C#Type不能被另一个访问?

时间:2010-03-12 01:05:06

标签: c# .net alias

好东西

// ok to alias a List Type
using AliasStringList = System.Collections.Generic.List<string>;

// and ok to alias a List of Lists like this
using AliasListOfStringList1 = System.Collections.Generic.List<System.Collections.Generic.List<string>>;

坏事

// However **error** to alias another alias
using AliasListOfStringList2 = System.Collections.Generic.List<AliasStringList>;

产生编译错误

  

类型或命名空间名称   找不到'AliasStringList'   (你错过了使用指令或   汇编参考?)

注意:这是using directive而不是using statement

3 个答案:

答案 0 :(得分:8)

你不能使用在另一个使用中使用的别名声明的别名。对于像你这样的一组使用,你可以假设使用声明的兄弟不存在。

From MSDN

  

编写 using-alias-directives 的顺序没有任何意义,并且使用引用的 namespace-or-type-name 的解析-alias-directive 不受 using-alias-directive 本身或直接包含的编译单元或命名空间体中的其他using-directive的影响。换句话说, using-alias-directive namespace-or-type-name 被解析为好像直接包含编译单元或命名空间体没有using-directives

它提供了您确切问题的简化示例,这是预期的行为:

namespace N1.N2 {}
namespace N3
{
   using R1 = N1;         // OK
   using R2 = N1.N2;      // OK
   using R3 = R1.N2;      // Error, R1 unknown
}

答案 1 :(得分:3)

documentation说:

  

使用别名的右侧   指令必须始终是一个   完全合格的类型,无论如何   使用它之前的指令。

所以基本上alias指令忽略其他using指令。

答案 2 :(得分:0)

虽然这个问题没有要求在This duplicate question询问时消除编译错误的解决方案,但我会列出到目前为止我找到的内容。

  • Solution0:独立命名空间(Nick's answer

  • Solution1:嵌套命名空间(受Nick's answer启发)

    using StringList = System.Collections.Generic.List<string>;
    namespace Inner {
        using ListOfStringList = System.Collections.Generic.List<StringList>;
        ...
    }
    
  • 解决方案2:继承(Paul's answer

    using StringList = System.Collections.Generic.List<string>;
    public class ListOfStringList : System.Collections.Generic.List<StringList> {}
    ...
    

但是解决方案2会遇到一些问题,你可能需要包装System.Collections.Generic.List<StringList>的所有构造函数。