2012-09-07 14 views
13

Ho due elementi nella mia classe: Uno è una proprietà pubblica e l'altro è un metodo statico che accetta un parametro.Ambiguità tra codice statico e istanza

Davvero non capisco perché Visual Studio 2010 non sia in grado di vedere la differenza tra questi due elementi.

Qualcuno potrebbe spiegarmelo?

Ecco il codice:

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

Ecco l'errore:

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

risposta

10

E 'possibile fare riferimento a un metodo come un delegato, non solo chiamandolo. Ad esempio, la seguente potrebbe essere l'uso sarebbe valida del metodo:

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

Dato che il metodo non ha bisogno di essere in realtà chiamato con parentesi, non v'è alcun modo di determinare se item.IsShipped è supposto per fare riferimento alla metodo gruppo per IsShipped o per essere la proprietà IsShipped.

Anche se fosse consentito, sarebbe un punto che potrebbe provocare confusione. Sarebbe preferibile, dal punto di vista della manutenzione del codice, avere nomi diversi per la proprietà/metodo, anche se il compilatore fosse abbastanza intelligente da sapere quale usare quando (o peggio, se ne sceglieva uno arbitrariamente).

8

È possibile sovraccaricare metodi con firme diverse, ma non si può avere un campo o proprietà con lo stesso nome di un metodo.

Questo perché il nome non elaborato di un metodo viene valutato in un gruppo di metodi, utilizzato durante la creazione di un delegato.

questo frammento di codice mostra chiaramente il problema:

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