2012-09-07 11 views
13

Tengo dos elementos en mi clase: uno es una propiedad pública y el otro es un método estático que toma un parámetro.Ambigüedad entre código estático y de instancia

Realmente no entiendo por qué Visual Studio 2010 no puede ver la diferencia entre estos dos elementos.

¿Podría alguien explicarme esto?

Aquí está el código:

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

Aquí está el error:

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

Respuesta

10

Es posible hacer referencia a un método como delegado, no sólo llamándolo. Por ejemplo, el siguiente podría sería válido el uso del método:

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

Teniendo en cuenta que el método no tiene por qué ser en realidad se llama con paréntesis, no hay manera de determinar si se supone item.IsShipped para referirse a la grupo de métodos para IsShipped o para ser la propiedad IsShipped.

Incluso si fuera permitido, sería un punto que podría dar lugar a confusión. Sería preferible desde el punto de vista del mantenimiento del código tener diferentes nombres para la propiedad/método, incluso si el compilador fuera lo suficientemente inteligente como para saber cuál usar cuando (o, lo que es peor, si eligiera uno arbitrariamente).

8

Puede sobrecargar métodos con diferentes firmas, pero no se puede tener un campo o propiedad con el mismo nombre que un método.

Esto se debe a que el nombre sin formato de un método se evalúa como un grupo de métodos, que se usa al crear un delegado.

Este fragmento de código muestra claramente el problema:

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