2012-09-07 67 views
13

我的課中有兩個項目:一個是公共屬性,另一個是採用參數的靜態方法。靜態和實例之間的歧義代碼

我真的不明白爲什麼Visual Studio 2010無法看到這兩項之間的區別。

有人能解釋這一個給我嗎?

下面是代碼:

public bool IsShipped { 
    get { 
    #region ' Test Code ' 
    if (!String.IsNullOrEmpty(TrailerNo) || (TruckDate != Global.NODATE)) { 
     return true; 
    } 
    #endregion 
    return false; 
    } 
} 

public static bool IsShipped(string boxNumber) { 
    var array = GetCrate(boxNumber); 
    if (array != null) { 
    foreach (var item in array) { 
     if (item.IsShipped) { 
     return true; 
     } 
    } 
    } 
    return false; 
} 

以下是錯誤:

Error 1 Ambiguity between 'AcpClasses.AcpPackNShip.IsShipped' and 'AcpClasses.AcpPackNShip.IsShipped(string)' C:\Users\cp-jpool\My Projects\VS\Live\Common\Classes\AcpPackShip.cs 242 20 CoilPC

screenshot

回答

10

這有可能是指一個方法的委託,而不是僅僅通過調用它。例如,下面可能將是有效的使用方法:

Func<string, bool> myFunction = item.IsShipped; 

鑑於該方法不需要用括號來居然叫,也沒有確定是否item.IsShipped應該指的路方法組爲IsShipped或成爲屬性IsShipped

即使它允許,這可能會導致混淆。從代碼維護的角度來看,爲屬性/方法指定不同的名稱是可取的,即使編譯器足夠聰明以知道在使用哪一個時(或者更糟糕的話,如果它只是任意選擇一個)。

8

可以重載不同簽名的方法,但你不能有一個字段或屬性與方法同名。

這是因爲方法的原始名稱評估爲創建委託時使用的方法組。

的這段代碼清楚地表明瞭問題:

bool b = item.IsShipped; 
Func<string, bool> d = item.IsShipped;