2012-01-10 51 views
27

¿Qué es la firma del método en el siguientela Firma en C#

int DoSomething(int a, int b); 

tipo de retorno es una parte de la firma o no ???

Respuesta

54

El tipo de devolución no es parte de la firma del método en C#. Solo el nombre del método y sus parámetros tipos (pero no el parámetro nombres) son parte de la firma. No se puede, por ejemplo, tiene estos dos métodos:

int DoSomething(int a, int b); 
string DoSomething(int a, int b); 

Para que quede claro: Los métodos no pueden ser sobrecargados en función de su tipo de retorno. Deben tener un nombre único, tipos de parámetros únicos o pasar sus argumentos de forma diferente (por ejemplo, usando out o ref).

Editar: Para responder a su pregunta original, la firma del método para su método es:

DoSomething(int, int) 

Tenga en cuenta que todo esto se aplica a los métodos normales. Si estás hablando de delegate s, entonces deberías ver la respuesta del teclado P. (Versión corta: el tipo de devolución es parte de la firma de un delegado).

+0

@adamjmarkham: Solo puede hacerlo al anular en una subclase, no "según lo que haga el método". Y estoy bastante seguro de que el tipo de devolución * no * es parte de la firma. – BoltClock

+0

tipo de devolución no es parte de la firma del método mi padawan. – DarthVader

+0

@ ean5533 .... gracias por la descripción, me ayuda mucho ... – Usman

13

De MSDN:

La firma de un método consiste en el nombre del método y el tipo y especie (valor de referencia o de salida) de cada de sus parámetros formales, considerados en el orden de izquierda a derecha. La firma de un método no incluye específicamente el tipo de retorno

Editar: Esa es la documentación de edad. Parece que la definición de 'firma' ha cambiado desde entonces. Ahora un método tiene dos firmas diferentes, una para la sobrecarga y otra para determinar la compatibilidad del delegado. Ver la respuesta del teclado P a continuación para más detalles.

+0

@downvoter, ¿Tiene mejor respuesta que esto? – gdoron

+0

@gdoron Si divide los puntajes de votación, puede ver que alguien rechazó cada respuesta en la página. Imagínate. Editar: Y ahora ellos votaron negativamente la pregunta también. – ean5533

+0

@gdoron - De todos modos, la respuesta de keyboardP, que hace referencia a documentación mucho más reciente, es mucho mejor que la mía. –

0

La firma no contiene el tipo de devolución. Ni los nombres de los parámetros. En su caso, sería DoSomething(int, int)

12

De MSDN:

Un tipo de retorno de un método que no forma parte de la firma del método a los efectos de la sobrecarga de métodos. Sin embargo, es parte de la firma del método cuando se determina la compatibilidad entre un delegado y el método al que apunta.

Para aclarar, en su ejemplo, el tipo de devolución no es parte de la firma.Sin embargo, cuando hace coincidir la firma de un delegado, se considera parte de la firma. De MSDN:

Cualquier método que coincide con la firma del delegado, que consiste en el tipo de retorno y parámetros, se pueden asignar al delegado. Este hace posible cambiar programáticamente las llamadas a los métodos, y también conecta el nuevo código a las clases existentes. Siempre que conozca la firma del delegado , puede asignar su propio método delegado.

Así que creo que está basado en el contexto. La mayoría de las veces, y tal como se muestra en su código, el tipo de devolución no forma parte de él. Sin embargo, en el contexto de la delegación, se considera parte de ella.

39

¿El tipo de devolución es una parte de la firma o no?

Depende de por qué está haciendo la pregunta. ¿Por qué te importa?

Hay dos definiciones de firma de método. La definición del lenguaje C# no incluye incluyen el tipo de devolución, y utiliza la firma del método para determinar si se permiten dos sobrecargas. Dos métodos con la misma firma no están permitidos en un tipo. Como C# no considera que el tipo de devolución sea parte de la firma, C# no permite que se declaren dos métodos que difieran solo en el tipo de devolución en el mismo tipo.

El CLR, sin embargo, incluye el tipo de devolución en la firma. El CLR permite que dos métodos estén en el mismo tipo que difieren solo en el tipo de devolución.

Para ser más específicos: en C# la firma consiste en los métodos:

  • nombre
  • número de parámetros de tipo
  • número de parámetros formales
  • tipo de cada parámetro formal
  • out/ref/value-ness de cada parámetro formal

con las siguientes indicaciones adicionales:

  • tipo genérico limitaciones de parámetros no son parte de la firma
  • tipo de retorno no es parte de la firma
  • parámetros tipo y parámetros formales nombres no son parte de la firma
  • dos métodos pueden no diferir solamente IN OUT/ref

en el CLR la firma consiste en:

  • nombre
  • número de parámetros de tipo
  • número de parámetros formales
  • tipo de cada parámetro formal incluyendo modopts y modreqs
  • tipo de retorno incluyendo modopts y modreqs
  • árbitro/value-ness de cada parámetro formal

Tenga en cuenta que CLR no distingue entre "ref int" y "out int" al considerar las firmas. Tenga en cuenta que CLR hace distinguir entre los tipos modopt/modreq. (La forma en que el compilador de C# trata los tipos modospt/modreq es demasiado compleja para resumirla aquí.)

+4

He estado buscando en Google y no encontré nada sobre por qué el equipo de C# decidió que el tipo de devolución no formara parte de la firma. ¿Problemas de rendimiento solamente? ¿Podrías arrojar algo de luz? tks –

+0

Hola, me gustaría hacer la misma pregunta que Luis fillipe. –

+2

@mmhasannn: las sobrecargas deben diferir en la firma. Si el tipo de devolución es parte de la firma, entonces puede tener dos métodos que difieren solo en el tipo de devolución. Eso complica enormemente la resolución de sobrecarga. –

Cuestiones relacionadas