tôi biết làm thế nào để buộc một tham số kiểu là một kiểu phụ loại khác:Constrain loại tham số cho một loại cơ sở
public interface IMapping<T2>
{
public void Serialize<T3>(T3 obj)
where T3 : T2;
}
...
var mapping = MapManager.Find<Truck>();
mapping.Serialize(new TonkaTruck());
Có cách nào để buộc một tham số kiểu để trở thành một siêu kiểu loại khác?
public interface IMapping<T2>
{
public void IncludeMappingOf<T1>()
where T2 : T1; // <== doesn't work
}
...
var mapping = MapManager.Find<Truck>();
// Truck inherits Vehicle
// Would like compiler safety here:
mapping.IncludeMappingOf<Vehicle>();
mapping.Serialize(new TonkaTruck());
Hiện nay, tôi đang gặp để so sánh T1 và T2 khi chạy bằng IsSubclassOf
bên IncludeMappingOf
. Một giải pháp biên dịch an toàn sẽ thích hợp hơn. Bất kỳ ý tưởng?
EDIT: Thay đổi ví dụ thành thiết kế ít mùi hơn.
LƯU Ý: Câu hỏi được liên kết tương tự nhau nhưng không có câu trả lời phù hợp. Hy vọng rằng câu hỏi này sẽ làm sáng tỏ điều đó.
EDIT # 2:
đơn giản ví dụ:
public class Holder<T2>
{
public T2 Data { get; set; }
public void AddDataTo<T1>(ICollection<T1> coll)
//where T2 : T1 // <== doesn't work
{
coll.Add(Data); // error
}
}
...
var holder = new Holder<Truck> { Data = new TonkaTruck() };
var list = new List<Vehicle>();
holder.AddDataTo(list);
Compiler: Loại Đối số 'T2' là không thể chuyển nhượng để tham số type 'T1'. Vâng tôi biết rằng, tôi đang cố gắng để có được trình biên dịch để chỉ cho phép các trường hợp T2 IS gán cho kiểu tham số T1!
Khá thú vị một câu hỏi, tuy nhiên tôi không thể lắc cảm giác rằng có thể có một vấn đề thiết kế ở đây, tại sao không 'TruckMapping' kế thừa' VehiculeMapping' thay vì 'IMapping'? Tôi có nghĩa là nó âm thanh như bản đồ xe tải là một phiên bản chuyên biệt của bản đồ xe tổng quát hơn hoặc tôi thiếu cái gì? –
Có liên quan mạnh mẽ (trùng lặp): [Có thể hạn chế một tham số kiểu phương thức chung của C# như “có thể gán từ” tham số kiểu của lớp chứa không?] (Http://stackoverflow.com/questions/11255558/is-it-possible -to-constrain-ac-sharp-generic-method-kiểu-tham số-as-assignab) –
@SimonRapilly: Có lẽ đúng. Đây là một ví dụ giả tạo để giúp minh họa vấn đề. Tôi đã thay đổi ví dụ lên một chút. – CSJ