Skip to content
February 25, 2013 / windperson

C# Namespace的tricky現象

正好現在有個assembly,它的namespace跟class名稱恰好一樣:

using System;

namespace ClassLib
{
    public class ClassLib
    {
        public static string Echo(String input)
        {
            return input;
        }
    }
}

然後使用它時,根據有沒有用using directive以便少打字,可分為以下三種情況:

  1. 輸入full name不使用using directive來存取,OK:

    using System;
    
    namespace TestBuggyNameSpaceSolution
    {
        
        class Program
        {
            static void Main(string[] args)
            {
                String msg = ClassLib.ClassLib.Echo("test");
            }
        }
    }
    
  2. 原本使用using directive的一般狀況,此時卻會爆出compile錯誤!!!
    用using directive在使用它的class所包含的namespace的外頭

    using System;
    using ClassLib;
    namespace TestBuggyNameSpaceSolution
    {
        
        class Program
        {
            static void Main(string[] args)
            {
                String msg = ClassLib.Echo("test");
            }
        }
    }
    

    錯誤訊息是compiler搞不清楚Echo其實是個方法而不是物件:

    error CS0234: The type or namespace name ‘Echo’ does not exist in the namespace ‘ClassLib’ (are you missing an assembly reference?)

    這假如在被使用的class和namespace的名稱是不同時,Visual C# compiler會很清楚的識別出哪個是namespace,哪個是class,正常編譯,不會有錯誤。

  3. using directive在使用它的class所包含的namespace的內部

    using System;
    
    namespace TestBuggyNameSpaceSolution
    {
        using ClassLib;
        class Program
        {
            static void Main(string[] args)
            {
                String msg = ClassLib.Echo("test");
            }
        }
    }
    

    這樣就正常編譯不會有錯誤了。

真詭異,好像之前在ActionScript的東東有看過類似的奇怪現象@@

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: