2016-03-10 113 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> {} 
} 

這具有額外的優勢,你可以很容易地將這些類添加額外的功能以後,你需要它。