2012-09-07 1 views
13

クラスに2つのアイテムがあります.1つはパブリックプロパティで、もう1つはパラメータをとる静的メソッドです。静的コードとインスタンスコードのあいまいさ

なぜVisual Studio 2010でこれらの2つの項目の違いがわからないのか分かりません。

誰かが私にこのことを説明できますか?ここで

はコードです:ここでは

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; 
関連する問題