2010-05-01 11 views
6

En C#, es posible tener mismos parámetros todavía anular entre sí (que son diferentes en los tipos de retorno)La sobrecarga con misma firma parámetro

public override Stocks[] Search(string Field,string Param){ //some code} 
public override Stocks Search(string Field, string Param){//some code} 

C# devuelve error de compilación

+0

¿Qué pasaría si no asigno el valor de retorno, pero más bien simplemente llamado 'Search (field, param);'? –

+0

Entiendo lo que está insinuando, y también lo he pensado, – Soham

Respuesta

0

Por lo que yo sabe, no es posible

Incluso si lo es, es innecesariamente complicado. Simplemente devuelva una matriz en todos los casos (si solo se devuelve un valor, entonces se trata de una matriz de Existencias [1]). Eso debería ahorrarle algo de tiempo, especialmente desde que C# hace que usar arreglos sea bastante simple.

11

En C#, solo puede sobrecargar los métodos que tienen firmas diferentes.

El tipo de devolución de un método no está incluido en la firma, solo el nombre del método, los tipos y el número de parámetros (y su orden). Los dos ejemplos tienen la misma firma, por lo que no pueden existir juntos.

Clásicamente, se puede devolver una lista de elementos (matriz u otra estructura de datos) - si sólo se requiere una elemento, sólo tiene que devolver una lista con un elemento.

+0

Creo que iré con una lista – Soham

0

No: el compilador arroja un error porque solo usa los parámetros para determinar qué método llamar, no el tipo de devolución.

+1

@ Adam V - también usa el nombre del método;) – Oded

+0

@Oded - supuse que no era Es necesario decir eso. :) –

+0

@Oded, :) No es como si el compilador corriera buscando todos los métodos posibles que aceptaran la secuencia de parámetros específica sin importar el nombre ...Lo siento, la idea hizo reír, así que tuve que compartir. –

0

No, no puedes.

CLR lo permite, pero por alguna razón, los tipos C# decidieron no utilizar esta característica CLR.

+2

Es difícil de admitir en un idioma que se supone que es un miembro de la familia C, cuyos miembros generalmente no tienen noción de evaluación dependiente del contexto. –

3

Como ya indicó Oded en su respuesta, , no es posible sobrecargar un método cuando la única diferencia es el tipo de retorno.

public override Stocks[] Search(string Field,string Param){ //some code} 
public override Stocks Search(string Field, string Param){//some code} 

Piensa en ello: ¿Cómo debe saber el compilador qué variante de método llamar? Esto aparentemente depende de su resultado de búsqueda, y obviamente el compilador no puede saberlo con anticipación.

De hecho, lo que desea es una función que tiene dos posibles tipos de devolución. Lo que no desea es dos métodos separados, porque entonces tendría que decidir por adelantado a cuál llamar. Este es obviamente el enfoque equivocado aquí.

Una solución es devolver siempre una matriz; en el caso en el que sólo se encuentra un objeto Stocks, regresa una matriz de tamaño 1.

1

De un modo mediante el uso de múltiples interfaces:

struct Stock { public string Symbol; public decimal Price;} 
interface IByArray { Stock[] Search(string Field, string Param); } 
interface IByClass { Stocks Search(string Field, string Param); } 
class Stocks : IByArray, IByClass 
{ 
    Stock[] _stocks = { new Stock { Symbol = "MSFT", Price = 32.83m } }; 
    Stock[] IByArray.Search(string Field, string Param) 
    { 
     return _stocks; 
    } 
    Stocks IByClass.Search(string Field, string Param) 
    { 
     return this; 
    } 
} 
Cuestiones relacionadas