Heim >Backend-Entwicklung >C++ >Können generische C#-Konstruktoren bestimmte Parametertypen über Parameterlose Konstruktoren hinaus erzwingen?

Können generische C#-Konstruktoren bestimmte Parametertypen über Parameterlose Konstruktoren hinaus erzwingen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-14 15:52:43621Durchsuche

Kann der generische C#-Konstruktor die Angabe des Parametertyps erzwingen? Jenseits der Einschränkungen parameterloser Konstruktoren

In C# können Einschränkungen für generische Methoden festgelegt werden, um sicherzustellen, dass bestimmte Anforderungen erfüllt werden. Eine häufige Einschränkung besteht darin, anzugeben, dass ein generischer Typ einen Konstruktor ohne Parameter haben muss. Es stellt sich jedoch natürlich die Frage: Können wir dem Konstruktor spezifischere Einschränkungen auferlegen?

Fall: Erzwungener Parametertyp

Nehmen wir das in der Frage bereitgestellte Beispiel, in dem wir einen Konstruktor erzwingen möchten, der einen float[,]-Parameter akzeptiert. Erster Versuch:

<code class="language-c#">public static T Method<T>(T a) where T : new(float[,] u) {
    //...do something...
    return new T(new float[0, 0]);
}</code>

Die Kompilierung ist fehlgeschlagen, sodass wir nach Alternativen suchen mussten.

Lösung: Erstellen Sie einen benutzerdefinierten Delegaten

Um diese Einschränkung zu umgehen, haben wir einen Workaround eingeführt, indem wir einen Delegaten eingeführt haben, der für die Erstellung von Instanzen vom Typ T verantwortlich ist. Dieser Delegat übernimmt die erforderlichen Parameter als Parameter und gibt eine Instanz von T zurück.

<code class="language-c#">public static void Method<T>(T a, Func<float[,], T> creator) {
    //...do something...
}</code>

Ändern Sie unseren Code, um diesen Delegaten zu verwenden, mit den folgenden Ergebnissen:

<code class="language-c#">A.Method(float[,], instanceCreator);
Func<float[,], T> instanceCreator = (float[,] arr) => new T(arr);</code>

Diese Lösung ermöglicht es uns, dem Konstruktor komplexere Einschränkungen aufzuerlegen, indem wir einen geeigneten Delegaten übergeben.

Can C# Generic Constructors Enforce Specific Parameter Types Beyond Parameterless Constructors?

Das obige ist der detaillierte Inhalt vonKönnen generische C#-Konstruktoren bestimmte Parametertypen über Parameterlose Konstruktoren hinaus erzwingen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn