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

时间:2016-03-10 16:17:56

标签: c# alias directive using

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

class MyContextMock : IContext

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

using System;
using System.Collections.Generic;

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

是否可以在C#中的其他别名中使用foo.cs(6,19): error CS0246: The type or namespace name `TsvEntry' could not be found. Are you missing an assembly reference? 别名,或者我遗漏了using语句的工作方式?

5 个答案:

答案 0 :(得分:5)

检查此问题的文档:

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

它说:

  

使用alias-directives的顺序没有   引用的namespace-or-type-name的重要性和解析   通过 using-alias-directive不受的影响    using-alias-directive本身或中的其他using-directives   立即包含编译单元或命名空间主体。其他   单词,using-alias-directive的namespace-or-type-name是   解决好像立即包含编译单元或   namespace body没有using-directives。在示例中

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

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

从技术上讲,你不能做同样的命名空间,但如果你在命名空间1中做别名,并在嵌套命名空间中为这个别名做别名,它就会起作用:

namespace N1
{
    namespace N12 { }
}

namespace N2
{
    using R1 = N1;

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

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

答案 1 :(得分:3)

来自MSDN's Using alias directives

  

使用alias-directives的顺序没有   引用的namespace-or-type-name的重要性和解析   通过using-alias-directive不受其影响   using-alias-directive本身或其他using-directives   立即包含编译单元或命名空间体。其他   单词, using-alias-directive的namespace-or-type-name是   解决好像立即包含编译单元或   namespace body没有using-directives。

//强调我的

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

答案 2 :(得分:2)

作为对其他答案的补充。

如果您真的希望继续使用,那么嵌套命名空间将是最佳选择。因为对于第二个命名空间,然后将定义第一个使用。

以下内容可行,因为您位于更深的命名空间中:

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

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

    }
}

请注意,虽然它有效但我不建议使用这种代码结构,因为你最终可能会使用深层嵌套的代码。

答案 3 :(得分:1)

正如其他人所提到的,使用Alias这种方式是不可能的,但是,你可以使用类继承来获得类似的功能。

使用您的示例,您可以执行以下操作:

using System;
using System.Collections.Generic;

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

这样做的另一个好处是,您可以根据需要轻松地为这些类添加额外的功能。

答案 4 :(得分:1)

(在此添加此内容是因为我在搜索相关问题时经常遇到此问题,因此可能会对其他人有所帮助)

如果您要使用别名来实现某种编程风格的函数,那么您要找的是delegate关键字。 您可以将delegate看作是一个接口,只是它是一个函数。

所以代替 using Expression = Func<string>; using Converter = Func<List<string>, Expression>; 你做 delegate string Expression(); delegate Expression Converter(List<string> tokenizedExpressions);

https://weblogs.asp.net/dixin/functional-csharp-function-type-and-delegate