![]() |
Funktion überladen
Moin,
wieso geht das hier nicht:
Code:
Der Compiler meldet:
public User MaskExists(string Mask)
{ for (int i = 0; i <= users.Count - 1; i++) { Regex regex = new Regex(((User)users[i]).Mask); if (regex.IsMatch(Mask)) return (User)users[i]; } return null; } public bool MaskExists(string Mask) { return MaskExists(Mask) != null; } Zitat:
Wie kann ich das machen? |
Re: Funktion überladen
In Delphi müßtest du dem Compiler aber auch mit overload anweisen das zu tun.
|
Re: Funktion überladen
in C# muss man das aber ja nicht, wie kann ich das hier tun?
|
Re: Funktion überladen
Das was du möchtest geht nicht!
Überladen heißt gleicher Name unterschiedliche Signatur! Du nennst zwei Methoden gleich, die nur einen String bekommen, der Compiler weiß nicht welchen Typ du zurück möchtest (es könnten ja auch kompatible Typen sein). Wenn du einmal Integer und einmal STring als Argumente hättest, dann klappt's auch mit dem Überladen! Gruß Der Unwissende |
Re: Funktion überladen
In deinem fall sieht es aber auch, als ob du 2 signatur-gleiche Methoden in einer Klasse hättest. Woher soll dann der Compiler wissen, welche er nehmen soll.
|
Re: Funktion überladen
In dem Fall bietet sich ein Record als Rückgabewert an.
MeineFunktion().AsInteger MeineFunktion().AsString Gruss Thorsten |
Re: Funktion überladen
Also soweit ich weiss, ging das in Delphi. Der Rückgabewert unterscheidet sich doch hm.... Wenn ich das Ergebnis einer Funktion einem string zuweise, müsste der compiler ja wissen, dass ich die meine mit String als Rückgabewert.
|
Re: Funktion überladen
Danke omata, bleibt wohl sonst nichts ;)
|
Re: Funktion überladen
Hi,
in solchen Fällen kann man das Problem mit einer Dummy-Variablen umgehen :
Code:
Dadurch unterscheiden sich die Parameter der beiden Methode.
public User MaskExists(string Mask)
{ for (int i = 0; i <= users.Count - 1; i++) { Regex regex = new Regex(((User)users[i]).Mask); if (regex.IsMatch(Mask)) return (User)users[i]; } return null; } public bool MaskExists(string Mask, int dummy) { return MaskExists(Mask) != null; } Den Dummy-Int kann man dann einfach ignorieren. Gruß, pszopp |
Re: Funktion überladen
Zitat:
Zitat:
|
Re: Funktion überladen
Zitat:
Übrigens ist es unter .Net grundsätzlich möglich, überladene Methoden mit gleicher Signatur aber unterschiedlichem Rückgabewert zu deklarieren. Allerdings kenne ich keine Sprache außer CIL selbst, die dieses Feature unterstützt. |
Re: Funktion überladen
Zitat:
Jetzt überlädst du eine Methode, so grob in der Art:
Delphi-Quellcode:
Natürlich geht das noch in anderen Kombinationen, jedenfalls läufst du hier ganz schnell Gefahr einen Fehler zu übersehen und die falsche Methode aufzurufen, da sollte es jeder Compiler (jede Sprache) verbieten so etwas zuzulassen!
function doFoo(s : String) : A;
begin ... end; function doFoo(s : String) : B; begin ... end; procedure main; var ak : AK; begin ak := doFoo('Egal'); //<- Hier kann der Compiler nicht sagen welche Methode du möchtest end; [ANMERKUNG NACH ROTEM KASTEN] Ich möchte nochmal betonen, dass es keine Rechtfertigung gibt dies in einer Sprache zuzulassen, vollkommen unnötig! [/ANMERKUNG NACH ROTEM KASTEN] |
Re: Funktion überladen
Zitat:
|
Re: Funktion überladen
Zitat:
Code:
.method static void Main(string[] args)
{ .entrypoint .maxstack 1 call int32 GimmeFive() call void [mscorlib]System.Console::WriteLine(int32) ret } .method static int32 GimmeFive() { .maxstack 1 ldc.i4.5 ret } .method static string GimmeFive() { .maxstack 1 ldstr "Five" ret } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz