2010-05-01 15 views
6

In C#, es möglich ist, dieselben Parameter zu haben, noch sich gegenseitig überschreiben (die sie in den Rückgabetypen unterschiedlich sind)Überladen mit dem gleichen Parameter Unterschrift

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

C# gibt Kompilierungsfehler

+0

Was passiert, wenn ich nicht den Rückgabewert zuweisen passieren würde, aber eher einfach 'Search (field, param);'? –

+0

Ich verstehe, was Sie andeuten, und ich habe darüber auch gedacht, – Soham

Antwort

0

Soweit ich weiß, es ist nicht möglich.

Auch wenn es ist, ist es unnötig kompliziert. Geben Sie in allen Fällen ein Array zurück (wenn nur ein Wert zurückgegeben wird, handelt es sich um ein Array von Stocks [1]). Das sollte Ihnen Zeit sparen, zumal C# die Verwendung von Arrays sehr einfach macht.

11

In C# können Sie nur Methoden mit unterschiedlichen Signaturen überladen.

Der Rückgabetyp einer Methode ist nicht in der Signatur enthalten - nur der Methodenname, die Typen und die Anzahl der Parameter (und ihre Reihenfolge). Die beiden Beispiele haben die gleiche Signatur, so dass sie nicht zusammen existieren können.

Classically, kann man eine Liste von Elementen (Array oder einer anderen Datenstruktur) zurückkehren - wenn auch nur ein Element erforderlich ist, können Sie einfach eine Liste mit einem Element zurück.

+0

Ich denke, ich werde mit einer Liste gehen – Soham

0

Nein - Der Compiler gibt einen Fehler aus, weil er nur die Parameter verwendet, um zu ermitteln, welche Methode aufgerufen werden soll, und nicht den Rückgabetyp.

+1

@Adam V - es verwendet auch den Namen der Methode;) – Oded

+0

@Oded - dachte, es war nicht notwendig, das zu sagen. :) –

+0

@Oded, :) Nicht so, als würde der Compiler nach allen möglichen Methoden suchen, die die spezifische Parametersequenz unabhängig vom Namen akzeptiert ...Entschuldigung, der Gedanke machte Kichern, also musste ich teilen. –

0

Nein, das geht nicht.

CLR erlaubt es, aber aus irgendeinem Grund entschieden sich die C# -Dudes, diese CLR-Funktion nicht zu verwenden.

+2

Es ist schwer, in einer Sprache zu unterstützen, die ein Mitglied der C-Familie sein soll, deren Mitglieder im Allgemeinen keine kontextabhängige Bewertung haben. –

3

Wie Oded bereits in seiner Antwort darauf hinweist, ist es nicht möglich, eine Methode zu überlasten, wenn der einzige Unterschied der Rückgabetyp ist.

Denken Sie darüber nach: Wie sollte der Compiler wissen, welche Methodenvariante aufgerufen werden soll? Dies hängt offenbar von Ihrem Suchergebnis ab, und offensichtlich kann der Compiler das nicht im Voraus wissen.

In der Tat, was Sie wollen, ist eine Funktion, die zwei mögliche Rückgabetypen hat. Was Sie nicht wollen, ist zwei separate Methoden, weil Sie dann entscheiden müssten, welche zu nennen. Dies ist offensichtlich der falsche Ansatz hier.

Eine Lösung ist immer ein Array; für den Fall, in dem nur ein Stocks Objekt gefunden wird, können Sie eine Reihe von Größe zurück 1.

1

In einer Art und Weise mehr Schnittstellen unter Verwendung von:

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