Tôi không thể hiểu tại sao mã C # sau không biên dịch.
Như bạn có thể thấy, tôi có một phương thức chung tĩnh Một cái gì đó với một IEnumerable<T>
tham số (và T
bị ràng buộc là một IA
giao diện) và tham số này không thể được chuyển đổi hoàn toàn thành IEnumerable<IA>
.
Giải thích là gì? (Tôi không tìm kiếm cách giải quyết, chỉ để hiểu lý do tại sao nó không hoạt động).
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
Lỗi tôi nhận được trong Something2(bar)
dòng:
Đối số 1: không thể chuyển đổi từ 'System.Collections.Generic.List' thành 'System.Collections.Generic.IEnumerable'
T
các loại tài liệu tham khảo. Nếu bạn sử dụng điều kiện where T: class, IA
thì nó sẽ hoạt động. Câu trả lời liên kết có nhiều chi tiết hơn.
Something2(foo);
trực tiếp. Đi xung quanh .ToList()
để có được một List<T>
( T
là tham số loại của bạn được khai báo theo phương thức chung) là không cần thiết để hiểu điều này (a List<T>
là một IEnumerable<T>
).