Heim >Backend-Entwicklung >C++ >Können generische C#-Konstruktoren bestimmte Parametertypen über Parameterlose Konstruktoren hinaus erzwingen?
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?
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.
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.
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!