Здесь у нас есть простая иерархия классов и использование дженериков с ограничением типа new()
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
}
}
Код не удается скомпилировать в указанной строке с ошибкой:
'Base' должен быть не абстрактный тип с открытым конструктором без параметров, чтобы использовать его как параметр 'T' в родовом типе или методе 'Foo.DoSomething(T)'
Эта ошибка ясна и имеет смысл, но я надеялся, что компилятор поймет, что все производные от Base
(которые могут быть созданы в этой точке) имеют открытый конструктор без параметров.
Будет ли это теоретически возможным для компилятора?