2012-05-17 4 views
21

ich die folgende Schnittstelle haben, die den generischen Parameter des Typs T liefert einen Rückruf mit ...C# Generics: Wenn T ein Rückgabetyp ist, kann es auch ungültig sein? Wie kann ich diese Schnittstellen kombinieren?

public interface IDoWork<T> 
{ 
    T DoWork(); 
} 

aber ich auch die folgende Schnittstelle auch haben, aber es wird nicht einen Rückruf aufrufen, da es void zurückgibt .

Kann ich diese beiden Schnittstellen kombinieren und Laufzeitlogik verwenden, um den Unterschied zu ermitteln? Wie kann ich das machen?

+0

Schade, dass Sie nicht in Java Land sind, da Sie in der Lage wären etwas wie IDoWork ... 'zu tun. Ich bin irgendwie überrascht, dass C# so etwas nicht anbietet. –

+1

@ChrisCashwell, weil .NET-Generics in die CLR integriert sind, während es in Java nur ein Compiler-Trick ist (die JVM weiß nichts über Generics zur Laufzeit). Dies ist normalerweise ein Vorteil von .NET-Generics, aber es bedeutet auch, dass die Regeln strenger sind ... –

+0

@ThomasLevesque Wo kann ich mehr darüber lernen, wie .NETs Ansatz gegenüber Java einen Vorteil hat? – LamonteCristo

Antwort

20

Leider können sie nicht kombiniert werden.

Sie können dies im Framework sehen - deshalb gibt es beispielsweise eine separate Klasse Task und Task<T>.

aber sagen, dass Sie können oft Anteil Implementierungen in dieser Art von Szenario durch IDoWork<object> Verwendung und Weitergabe null für Werte usw.

+0

Ich frage mich, ob T == object und object == null in der Implementierung dann kann ich den Callback im Host überspringen. Klingt das vernünftig? – LamonteCristo

+0

@ makerofthings7 You ~ könnte ~ - aber es kann unangemessen sein, wenn Null ist ein erwarteter oder gültiger Wert. –

+1

Persönlich, da ihr Verhalten anders ist, würde ich ihnen etwas andere Namen geben wollen, um diesen Unterschied auszudrücken. –

1

Rückgabetyp ein Teil der Methodensignatur ist, so T DoWork() und nichtig DoWork() sind unterschiedlich, und void ist kein Typ und es ist kein null. Es ist ein Hinweis darauf, dass sich bei der Rückkehr aus der Methode nichts im Auswertungsstapel befindet.

+0

In C# ist der Rückgabetyp nicht Teil der [Methodensignatur] (https://msdn.microsoft.com/en-us/library/aa691131%28v=vs.71%29.aspx) – suhair

Verwandte Themen