2012-09-20 16 views
5

me he encontrado con esto varias veces en la última semana, y estoy curioso por saber la razón - que tenía un google, pero no pudo encontrar nada directamente relevante.sobrecarga estática + Método dinámico falla

tengo una clase con un método dinámico, y puedo añadir un método estático con la misma interfaz:

public class MyClass 
{ 
    public int MyMethod() 
    { 
     //do something #1; 
    } 

    public static int MyMethod() 
    { 
     //do something 
    } 
} 

Esto está muy bien, pero si trato de llamar al método estático del método dinámico, reemplazando # 1 con return MyClass.MyMethod(), aparece un error "La llamada es ambigua entre los siguientes métodos o propiedades: MyClass.MyMethod() y MyClass.MyMethod().
Si se elimina el método estático, el error cambia a" Un objeto se requerirá la referencia .. ", lo cual tiene sentido.

Por qué es esto ambigu ¿ous? Ha sido prologado con el nombre de la clase para especificar el método estático, que funciona desde cualquier otro lugar en el código.
¿Por qué no aquí?

EDIT: No había intentado en realidad compilarlo sin el método dinámico llamando al estático, simplemente había pasado por VS sin subrayarlo.
Pero sigue siendo una pregunta similar, pero supongo que con un añadido "¿Por qué no puede haber tanto, como uno es estático, y uno no"

+0

es el código dado compilar para usted? Lanza el error CS0111 para mí (ya define un miembro llamado 'MyMethod' con los mismos tipos de parámetros). – prashanth

+1

Eso es un mensaje de error impar (incorrecto), pero es probable que sólo por el orden en que el compilador intenta resolver y verificar la referencia. – McGarnagle

+0

@prashanth Estás en lo correcto. Había hecho una suposición - ver edición. – 3Pi

Respuesta

1

Además aquí es un similar question on SO, dando alguna explicación, por qué no puede tener dos métodos con la misma firma.

public class MyClass 
{ 
    public int MyMethod() 
    { 
     return 0; 
    } 

    public static int MyMethod() //Here compiler says, that you've already got method MyMethod with same parameter list 
    { 
     return 0; 
    } 
} 

Por lo tanto, no se puede tener esos métodos en absoluto

un vistazo a this

Al principio:

The signature of a method consists of the name of the method and the type and kind (value, reference, or output) of each of its formal parameters, considered in the order left to right. The signature of a method specifically does not include the return type, nor does it include the params modifier that may be specified for the right-most parameter.

En segundo lugar:

Overloading of methods permits a class, struct, or interface to declare multiple methods with the same name, provided their signatures are unique within that class, struct, or interface.

EDITAR

En cuanto a la razón por la que obtiene ese error: es probable que aún no haya compilado y vea un error subrayado con rojo. Si compila, verá el error subrayado con azul no en la línea donde llama a su método estático, sino en la línea donde está definido el método estático.

+0

La respuesta en la pregunta a la que se vinculó es la razón por la que estaba buscando, gracias. – 3Pi

+1

@ 3PI Otro enlace, donde Jon Skeet explica este comportamiento: http://bytes.com/topic/c-sharp/answers/618378-static-non-static-methods-same-name-signature – horgh

0

So why is this ambiguous? It has been prefaced with the class name to specify the static method, which works from anywhere else in code. Why not here?

La razón es ambigua es porque usted podría tener una instancia propiedad en MyClass llamada MyClass. Creo que Eric Lippert describe el razonamiento con más detalle. No puedo encontrar esa publicación específica, pero here is a similar series from him.

Cuestiones relacionadas