C#使用别名作为其他使用别名的类型参数

Nat*_*ara 4 c# alias using directive

我试图在我的C#程序的顶部定义一对类型别名.这是我正在尝试做的一个简短示例:

using System;
using System.Collections.Generic;

namespace Foo {
    using TsvEntry = Dictionary<string, string>;
    using Tsv = List<TsvEntry>;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用mcs 3.2.8.0编译它时,我收到以下错误消息:

foo.cs(6,19): error CS0246: The type or namespace name `TsvEntry' could not be found. Are you missing an assembly reference?
Run Code Online (Sandbox Code Playgroud)

是否可以using在C#中的其他别名中使用别名,或者我错过了using语句的工作方式?

Red*_*Red 5

检查此问题的文档:

https://msdn.microsoft.com/en-us/library/aa664765(v=vs.71).aspx

它说:

写入using-alias-directives的顺序没有意义,using-alias-directive 引用的namespace-or-type-name的解析不受using-alias-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
}
Run Code Online (Sandbox Code Playgroud)

最后一个using-alias-directive导致编译时错误,因为它不受第一个using-alias-directive的影响.

从技术上讲,您不能使用相同的命名空间,但如果您在命名空间1中执行别名,并在嵌套命名空间中为此别名执行别名,则它将起作用:

namespace N1
{
    namespace N12 { }
}

namespace N2
{
    using R1 = N1;

    namespace N2
    {
        using R2 = R1.N12;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定在您的具体示例中使用别名是否值得,考虑尽可能少地使用它们,主要用于解决命名空间冲突.


Am_*_*ful 3

来自MSDN 的使用别名指令

using-alias-directives 的写入顺序并不重要,并且 using-alias-directive 引用的命名空间或类型名的解析不受 using-alias-directive 本身或其他 using-alias-directive 的影响。直接包含编译单元或命名空间主体中的指令。换句话说,using-alias-directive 的命名空间或类型名称被解析,就好像直接包含的编译单元或命名空间主体没有 using-directives 一样。

// 强调我的

在您的示例中,最后一个 using-alias-directive 会导致编译时错误,因为它不受第一个 using-alias-directive 的影响。