Với các lớp học sau ...Tại sao không thể suy ra các kiểu chung chung lồng nhau?
public abstract class FooBase<TBar> where TBar : BarBase{}
public abstract class BarBase{}
public class Bar1 : BarBase{}
public class Foo1 : FooBase<Bar1> {}
... và các phương pháp sau đây ...
public TBar DoSomething<TFoo, TBar>(TFoo theFoo)
where TFoo : FooBase<TBar>
where TBar : BarBase
{
return default(TBar);
}
Tại sao các dòng mã sau đây không thể bao hàm các kiểu trả về?
Bar1 myBar = DoSomething(new Foo1());
Thay vào đó tôi phải xác định các loại chung như thế này ...
Bar1 myBar = DoSomething<Foo1, Bar1>(new Foo1());
Tôi nghĩ một số người sẽ tự hỏi tại sao chúng tôi sẽ không ** thử ** sử dụng ràng buộc để suy ra loại. Một cách khác để suy nghĩ về điều này, là nếu bạn xem xét đầu tiên chúng ta phải xác định những loại bê tông nào đang được sử dụng cho TFoo và TBar, thì bất kỳ mã nào tham chiếu đến các kiểu này hiện nay đều sử dụng loại cụ thể. Trong trường hợp của 'FooBase', ở đây chúng tôi đang nói ** sau ** bạn biết loại 'TBar' là gì, sau đó' FooBase 'sẽ trở thành 'FeeBase '. Ràng buộc này không thể được sử dụng như là một phần của suy luận kiểu, bởi vì chúng ta không biết kiểu cho đến khi suy luận hoàn thành. Nó sẽ là logic tròn. –
AaronLS