2011-10-26 55 views

回答

11

如果你的意思是「它是多態還是不?那麼答案是否定的 - 除非您使用dynamic類型,否則運算符是由C#編譯器靜態發現的。例如,考慮下面的代碼:

using System; 

class Test 
{  
    static void Main(string[] args) 
    { 
     string x = "hello"; 
     string y = new string(x.ToCharArray());   
     Console.WriteLine(x == y); // True 

     object ox = x; 
     object oy = y; 
     Console.WriteLine(ox == oy); // False 

     dynamic dx = x; 
     dynamic dy = y; 
     Console.WriteLine(dx == dy); // True 
    } 
} 

==第一個呼叫使用在string聲明的操作,因爲編譯器知道這兩個操作數都string型。它比較兩個字符序列,發現它們相等,並返回True。

第二次調用==使用在object聲明,因爲表達oxoy的編譯時類型是object操作。該操作員只比較參考。引用是不同的(它們指的是不同的值),所以這返回False。請注意,在這種情況下,的值oxoy將在執行時引用字符串,但不是在編譯器確定要調用哪個超載時應予以考慮。 (它oxoy知道爲object型的。)

==第三呼叫使用動態類型,發現在執行時操作,使用實際類型的引用,而不是表達式的編譯時類型。這發現string中的過載,所以操作符再次返回True。

0

基本運算符重載是靜態的:

public static SomeClass operator ++(SomeClass arg) 

嘗試this Series呈現出一些例子