where-Klausel für einen Konstruktor in C #?

8

Also hier ist, was ich versuche zu tun.

Ich erstelle eine generische Klasse, die den vom generischen Parameter angegebenen Typ auf eine von zwei Weisen zuweist, die durch den überladenen Konstruktor bestimmt wird.

Hier ist das Beispiel:

%Vor%

Diese Klasse erfordert, dass Typ T in allen Fällen ein ref-Typ ist. Für den Standardkonstruktor möchten wir T über seinen Standardkonstruktor instanziieren. Ich möchte ein where T : new() auf meinen Standardkonstruktor setzen, wie folgt:

%Vor%

Dies ist jedoch nicht gültig C #. Im Grunde möchte ich nur die Einschränkung für Typ T hinzufügen, um einen Standardkonstruktor nur zu haben, wenn der Standardkonstruktor von MyClass () verwendet wird.

Im zweiten Konstruktor für MyClass lassen wir den Benutzer bestimmen, wie er T mit einer eigenen Zuweisungsmethode zuordnen soll. Daher ist es offensichtlich sinnvoll, dass MyClass T nicht in allen Fällen als Standard-Konstrukt erzwingt.

Ich habe das Gefühl, dass ich dafür Reflektion im Standardkonstruktor verwenden muss, aber ich hoffe nicht.

Ich weiß, dass dies getan werden kann, weil die Klasse Lazy<T> in .NET 4.0 nicht erfordert, dass T standardmäßig auf Klassenebene konstruierbar ist, aber es hat Konstruktoren, die denen in meinem Beispiel ähnlich sind. Ich würde gerne wissen, wie Lazy<T> es zumindest tut.

    
void.pointer 12.05.2011, 13:17
quelle

4 Antworten

8

Sie können in die Deklaration nur Einschränkungen einfügen, in denen Sie einen generischen Typparameter einführen

Sie könnten jedoch eine generische -Methode für einen nicht generischen -Typ einführen:

%Vor%

(Ich würde persönlich nur Func<T> verwenden, anstatt einen separaten Delegattyp btw zu deklarieren.)

Dann können Sie verwenden:

%Vor%     
Jon Skeet 12.05.2011, 13:23
quelle
7
  

Grundsätzlich möchte ich nur die Einschränkung für Typ T hinzufügen, um einen Standardkonstruktor nur zu haben, wenn der Standardkonstruktor von MyClass () verwendet wird.

Es ist nicht möglich, dies mit einer Einschränkung für T zu erzwingen. Entweder ist where T : new() in der Definition von MyClass<T> angegeben oder Sie verzichten auf eine solche Einschränkung.

  

Ich habe das Gefühl, dass ich dafür Reflektion im Standardkonstruktor verwenden muss, aber ich hoffe nicht.

Sie können die Einschränkung nicht erzwingen, aber Sie können

sagen %Vor%

ruft den Standardkonstruktor für T auf.

  

Ich weiß, dass dies getan werden kann, weil die Lazy-Klasse in .NET 4.0 nicht erfordert, dass T auf Klassenebene standardmäßig konstruierbar ist, aber es hat Konstruktoren, die denen in meinem Beispiel ähnlich sind. Ich würde gerne wissen, wie Lazy es zumindest macht.

Lazy<T> erfordert, dass Sie einen Delegaten angeben, der die Instanzen T zurückgibt. Grundsätzlich müssen Sie eine Func<T> angeben.

    
jason 12.05.2011 13:19
quelle
3

Sie können versuchen, Activator

zu verwenden %Vor%     
Stecya 12.05.2011 13:22
quelle
-2

Nun, Sie müssen entweder die Einschränkung haben oder nicht. Es stellt sich heraus, dass Lazy Activator verwendet, um eine Instanz zu erstellen. So funktioniert Lazy<T> im Falle von Urheberrechtsverletzungen entfernt.

    
Josh M. 12.05.2011 13:22
quelle

Tags und Links