2016-03-10 48 views
3

我试图在C#程序的顶部定义一对类型别名。这是什么,我试图做一个简单的例子:C#使用别名作为其他使用别名中的类型参数

using System; 
using System.Collections.Generic; 

namespace Foo { 
    using TsvEntry = Dictionary<string, string>; 
    using Tsv = List<TsvEntry>; 
} 

当我尝试编译此使用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? 

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

回答

1

MSDN's Using alias directives

中使用别名指令的排列顺序没有 意义,名称空间或类型名称的分辨率由使用别名指令是引用 不受 使用别名指令本身或立即包含编译单元或名称空间主体的 中的其他使用指令的影响。在其他 单词中,using-alias-directive的namespace-or-type-name是 ,就好像直接包含的编译单元或 名称空间主体没有使用指令一样。

//重点煤矿

在你的榜样,最后使用别名指令导致编译时错误,因为它不受第一个using-ALIAS-指示。

5

对于这个问题,检查文档:

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

它说:

中使用别名指令的排列顺序没有 意义和namespace-的分辨率或 - 型号名称为 由使用别名指令不受 使用 - 其他s指令本身或通过立即包含编译单元或名称空间主体中的其他使用指令。在其他 单词中,using-alias-directive的namespace-or-type-name是 ,就好像立即包含的编译单元或 名称空间主体没有使用指令一样。在这个例子中

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

在编译时错误的最后一个使用别名指示的结果,因为它 不受第一使用别名指令。

技术上讲,你不能这样做相同的命名空间,但如果你在命名空间1做别名,此别名在嵌套命名空间做别名,它会工作:

namespace N1 
{ 
    namespace N12 { } 
} 

namespace N2 
{ 
    using R1 = N1; 

    namespace N2 
    { 
     using R2 = R1.N12; 
    } 
} 

我不是真的确定在你的具体例子中值得使用别名,尽量少用它们,主要是为了解决命名空间冲突。

1

正如另一个答案。

如果你真的想继续你的方式,嵌套命名空间将是一条路。因为对于第二个命名空间,第一个使用将被定义。

下将工作,因为你是在一个更深层次的命名空间:

namespace N1 
{ 
    using TsvEntry = Dictionary<string, string>; 

    namespace N1.N2 
    { 
     using Tsv = List<TsvEntry>; 

    } 
} 

请注意,尽管这是工作,我不建议使用这种代码结构的,因为你可以用一个深深的结束嵌套代码。

0

正如其他人所说,以这种方式使用别名是不可能的,但是,您可以使用类继承来获得类似的功能。使用

你的榜样,你可以做这样的事情:

using System; 
using System.Collections.Generic; 

namespace Foo { 
    class TsvEntry : Dictionary<string, string> {} 
    class Tsv : List<TsvEntry> {} 
} 

这具有额外的优势,你可以很容易地将这些类添加额外的功能以后,你需要它。