2011-04-08 77 views
0

MyClass的正在按以及myClass的在下面的例子。雙重性質

我知道每個人都會說這不是一個好習慣,可以用下面的例子

CODE:

class myClass 
{ 
    public static void Main(string[] args) 
    { 
     string @myClass = "my-Class"; 

     myClass.Replace("-", " "); //myClass works as string 
     myClass ob = new myClass(); //myClass works as myClass 

     ob.i(); 
    } 
    public void i() 
    { 

    } 
} 

但我想知道:

  • 這是一個編譯器錯誤?編譯器應該給出警告,因此編號爲
  • 編譯器如何管理這種雙重性質?
+0

嗷,我的眼睛!但+1,現在我也很好奇...... – Cameron 2011-04-08 01:53:09

+0

編譯器爲什麼要給出警告?你在兩個完全不同的上下文中使用myClass,並且編譯器沒有歧義。 – 2011-04-08 01:57:11

+0

區別在於上下文。解析器可以根據上下文來確定它的標記是對象還是類。 – 2011-04-08 02:05:39

回答

3

你基本上只是在做一些看起來怪異,但編譯器可以根據上下文看着辦吧。

string @myClass = "my-Class"; 

這是宣佈名爲MyClass的字符串變量。在變量名稱上使用@可讓您創建具有通常不被允許的名稱的變量(例如關鍵字)。在你的情況下,@不是必需的,因爲myClass不是關鍵字,但你仍然可以使用它。有關信息,請參閱此問題:What does the @ symbol before a variable name mean in C#?

myClass.Replace("-", " "); 

這是調用串在你的MyClass的變量替換法。

myClass ob = new myClass(); 

這是創建一個類型爲「myClass」的新對象。編譯器可以通過使用myClass來指示類型,而不是字符串變量。

1

下面這行是指您使用字符串@myClass而不是myClass類定義的字符串變量。

myClass.Replace("-", " "); //myClass works as string 
+0

是的,但爲什麼在編譯時沒有名稱衝突? – Cameron 2011-04-08 01:53:59

+0

一個是類型,另一個是局部變量名稱。這是合法的。 – 2011-04-08 01:54:51

+0

@Chris:啊哈!當人們經常將屬性命名爲與他們的類型相同時,這很簡單,而且很明顯在回顧過程中。謝謝! – Cameron 2011-04-08 03:11:08

0

第一個@myClass是一個實例或變量名,這不會與類(類型)名稱myClass衝突。

所以沒有錯誤或警告。

1

您使用myclass作爲一個類型以及一個變量名 - 編譯器可以將他們兩個人之間的區別,只有當他們發生衝突,你將有一個問題 - 你Main方法在IE中,這將創建一個編譯器錯誤:

myClass.Main(new string [1]); 
2

注意,你甚至都不需要@

string myClass = "my-Class"; 

以上是完全正常的。

你說:

compiler should give warning. 

應該嗎?其實沒有含糊之處。

考慮這個非常典型的場景:

public class MyRandom 
{ 
    public Random Random { get; private set; } 

    public MyRandom() 
    { 
     // Is this ambiguous? No--the left HAS to be the property; 
     // the right HAS to be the type name. 
     Random = new Random(); 
    } 
} 

這真的不是罕見變量的名字也類型的名稱。只有當一些成員重疊時纔會有歧義。例如:

public class MyThreadPool 
{ 
    public static void Add(Thread thread) 
    { 
     Console.WriteLine("Called the static method."); 
    } 
} 

public class SomeOtherClass 
{ 
    public List<Thread> MyThreadPool { get; private set; } 

    public SomeOtherClass() 
    { 
     MyThreadPool = new List<Thread>(); 
    } 

    public void DoSomethingAmbiguous() 
    { 
     // To me, it would make sense for the compiler to issue a warning here, 
     // as it seems rather ambiguous (to me at least). However, it doesn't, 
     // which tells me the behavior is defined somewhere in the spec (I'm too lazy 
     // to check). 
     MyThreadPool.Add(null); 
    } 
}