auf diese Frage Referenzierung: Cannot create an instance of the variable type 'Item' because it does not have the new() constraintinitialisieren generischer Typ mit nicht-leeren Konstruktor
Ich mag eine Instanz von einem generischen Typ mit einem nicht leeren Konstruktor erstellen.
public class A{};
public class B
{
public B(int){/*...*/}
}
public class C
{
public static T validate<T>(int index)
where T : A,
new(int) //error
{
if(/*validation*/)
return null;
return new T(index);
}
}
Wenn ich versuche, B b = validate<B>(42);
zu anrufen habe ich diesen Fehler:
'B' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'C.validate(int)'
Frage 1: Warum kann ich keine Parameter Konstrukteure nur?
Frage 2: Wie kann ich mein Problem ohne Delegaten oder Schnittstellen lösen? (Ich bin immer auf der Suche nach ausgefallenen Lösungen.)
Die Antwort auf Frage 1 ist einfach: [es ist noch nicht gebaut] (https://github.com/dotnet/roslyn/issues/2206).Dies ist keine C# -Begrenzung; Die CLR selbst unterstützt solche Einschränkungen nicht und müsste erweitert werden, um dies zu ermöglichen. Es ist nicht eines dieser Features, die so toll sind, dass die Leute an der Spitze plappern, um es hineinzulegen. (Stellen Sie sich zunächst 'new (int, int, bool, int, bool)' vor - es könnte die Form eines Ihrer haben Konstruktoren, aber viel Glück herauszufinden, was dieser Konstruktor * tun * soll.) –
Eine einfache Lösung wäre, die 'new()' - Einschränkung zu verwenden und den Standardkonstruktor zu verwenden (fügen Sie ihn hinzu). Dann nutzen Sie die 'Index' Eigenschaft:' public static T Validate (int index) where T: A, new() { if (Validierung) return null; T t = neu T(); t.Index = Index; Rückkehr t; } 'Sonst könnten Sie' Activator.CreateInstance' wie [hier] verwenden (https://Stackoverflow.com/a/15003163/284240) –
Gute Nachrichten - sie wollen es nicht bauen. Siehe diesen Beitrag: https://github.com/dotnet/csharplang/issues/769. Dieser Beitrag enthält auch eine mögliche Lösung/Abhilfe. – Mafii