Hier haben wir eine einfache Klasse herarchy, und die Verwendung von Generika mit einem type constraint von new()
Allgemeintypeinschränkung neuer() und eine abstrakte Basisklasse
public abstract class Base
{
}
public class Derived : Base
{
}
public class TestClass
{
private void DoSomething<T>(T arg) where T : new()
{
}
public void TestMethod()
{
Derived d1 = new Derived();
DoSomething(d1); // compiles
Base d2 = new Derived();
DoSomething(d2); // compile error
}
}
Der Code in der angegebenen Zeile zu kompilieren fehlschlägt, mit ein Fehler von:
‚Base‘ ein nicht-abstrakten Typ mit einem öffentlichen parameterlosen Konstruktor, um sie als Parameter ‚T‘ in der generischen Art oder Methode zu verwenden sein muss ‚Foo.DoSomething (T)‘
Dieser Fehler ist klar und sinnvoll, aber ich hatte gehofft, dass der Compiler würde verstehen, dass alle Ableitungen von Base
(die an dieser Stelle instanziiert werden könnte) einen öffentlichen parameterlosen Konstruktor haben.
Wäre das theoretisch möglich für den Compiler?
Es ist diese Zeile, die mir mehr "nicht abstrakte Art" als die parameterlose Konstruktorklausel –