Qui abbiamo una semplice herarchy classe, e l'uso di farmaci generici con un type constraint di new()
tipo di vincolo generico di nuovo() e una base astratta classe
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
}
}
Il codice fallisce la compilazione alla linea indicata con un errore di:
'Base' deve essere un tipo non astratta con un costruttore senza parametri pubblico al fine di utilizzarlo come parametro 'T' nel tipo generico o il metodo 'Foo.DoSomething (T)'
Questo errore è chiaro e ha senso, ma speravo che il compilatore avrebbe capito che tutte le derivazioni di Base
(che potrebbero essere istanziate a questo punto) hanno un costruttore pubblico senza parametri.
Questo sarebbe teoricamente possibile per il compilatore?
È questa linea che mi preoccupa di più di "tipo non astratto" rispetto alla clausola del costruttore senza parametro –