2012-09-07 8 views
13

Ich habe zwei Elemente in meiner Klasse: Eine ist eine öffentliche Eigenschaft, und die andere ist eine statische Methode, die einen Parameter verwendet.Mehrdeutigkeit zwischen statischen und Instanzcode

Ich verstehe wirklich nicht, warum Visual Studio 2010 den Unterschied zwischen diesen beiden Elementen nicht sehen kann.

Konnte mir jemand diesen erklären? Hier

ist der Code:

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; 
} 

Hier wird der Fehler:

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

Antwort

10

Es ist möglich, ein Verfahren als Delegierter zu beziehen, nicht nur durch Aufruf. Zum Beispiel würde die folgende könnte gültige Anwendung des Verfahrens sein:

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

Da das Verfahren nicht tatsächlich mit Klammern genannt werden muss, gibt es keine Möglichkeit zu bestimmen, ob item.IsShipped sollte auf den Bezug zu nehmen Methodengruppe für IsShipped oder die Eigenschaft IsShipped sein.

Auch wenn es erlaubt wäre, wäre es ein Punkt, der wahrscheinlich zu Verwirrung führt. Aus Sicht der Codepflege wäre es vorzuziehen, unterschiedliche Namen für die Eigenschaft/Methode zu haben, selbst wenn der Compiler irgendwie schlau genug wäre, um zu wissen, welcher zu verwenden ist (oder, noch schlimmer, wenn er nur willkürlich gewählt wurde).

8

Sie Methoden mit unterschiedlichen Signaturen überlasten können, aber Sie können kein Feld haben oder Eigenschaft mit dem gleichen Namen wie eine Methode.

Das liegt daran, dass der unverarbeitete Name einer Methode zu einer Methodengruppe ausgewertet wird, die beim Erstellen eines Delegaten verwendet wird.

Dieser Code-Schnipsel zeigt deutlich das Problem:

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