Wird ein generischer Konstruktor in einer nicht-generischen Klasse unterstützt?
Wird es nicht unterstützt, wird es unterstützt, aber ich habe zu tun, einige tricks?
Beispiel:
class Foo
{
public Foo<T1,T2>(Func<T1,T2> f1,Func<T2,T1> f2)
{
...
}
}
den Generika sind nur im Konstruktor, gibt es kein Feld/property hing an Ihnen, ich benutze es (Generika) zur Durchsetzung der Typ, Korrelation f1 und f2.
Bemerkung: ich fand die Problemumgehung -- statische Methode Erstellen, aber trotzdem bin ich neugierig, warum habe ich problem mit einfacher Ansatz.
InformationsquelleAutor der Frage greenoldman | 2010-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, generische Konstruktoren werden nicht unterstützt, entweder generische oder nicht-generische Klassen. Ebenfalls generische Ereignisse, Eigenschaften und Finalizer nicht unterstützt.
Nur gelegentlich ich Zustimmen, dass es nützlich sein würde - aber das würde die syntax Aussehen ziemlich schrecklich. Zum Beispiel, angenommen Sie haben:
Was würde
tun? Rufen Sie den generischen Konstruktor der nicht-generische Klasse, oder der normale Konstruktor der generischen Klasse? Man müsste unterscheiden zwischen Ihnen irgendwie, und es wäre etwas chaotisch 🙁
Ebenfalls, sollten Sie einen generischen Konstruktor in einer generischen Klasse:
Wie würden Sie den Konstruktor aufrufen? Hoffentlich können wir alle Stimmen zu, dass:
ist ziemlich grässlich...
Also ja, semantisch wäre es gelegentlich nützlich, aber die Hässlichkeit Gegengewicht, leider.
InformationsquelleAutor der Antwort Jon Skeet
Generische Konstruktoren werden nicht unterstützt, aber Sie können dies umgehen, indem man einfach die Definition eines generischen,
static
- Methode gibt eine neueFoo
:denen wird wie folgt verwendet:
InformationsquelleAutor der Antwort Peter Alexander
Hier ist ein Beispiel aus der Praxis darüber, wie man Sie gerne haben möchte extra Konstruktor parameter "type" und die Problemumgehung.
Werde ich vorstellen, ein einfaches
RefCounted
wrapper fürIDisposable
:Dieser scheint in Ordnung zu sein. Aber früher oder später würden Sie wie gewirkt
RefCounted<Control>
zuRefCounted<Button>
während halten sowohl die Objekt-Referenz zählen, d.h. erst wenn beide Instanzen entsorgt werden, entsorgen Sie das zugrunde liegende Objekt.Ist der beste Weg, wenn Sie schreiben könnte (wie C++, die Leute tun können)
Aber C# ist das nicht möglich. So die Lösung ist, verwenden einige Dereferenzierung.
Wenn Ihre Klasse haben Sie alle Felder, die sind generischer Art, haben Sie keine Wahl aber, um alle dieser Typen in der Klasse. Wenn Sie jedoch einfach nur verstecken wollte, irgendeine Art von Konstruktor, den Sie verwenden müssen, den oben genannten trick - mit einem versteckte-Konstruktor, um alles zusammen, und definieren eine normale generische Funktion aufgerufen, die Konstruktor.
InformationsquelleAutor der Antwort Earth Engine