Ở đây chúng ta có một herarchy lớp đơn giản, và sử dụng Generics với một type constraint của new()
Generic loại chế mới() và một cơ sở trừu tượng lớp
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
}
}
Mã này thất bại trong việc biên dịch tại dòng chỉ định, với lỗi của:
'cơ sở' phải là một loại phi trừu tượng với một constructor parameterless nào để sử dụng nó như là tham số 'T' trong các loại generic hoặc phương pháp 'Foo.DoSomething (T)'
Lỗi này là rõ ràng và có ý nghĩa, nhưng tôi đã hy vọng rằng trình biên dịch sẽ hiểu rằng tất cả các dẫn xuất của Base
(có thể được khởi tạo tại thời điểm này) không có một constructor công khai parameterless.
Điều này có thể về lý thuyết cho trình biên dịch không?
Đó là dòng này khiến tôi lo lắng hơn 'loại không trừu tượng' hơn mệnh đề hàm tạo ít tham số –