Vì vậy, tôi chắc chắn điều này đã được trả lời ở đâu đó trước đó, nhưng tôi không thể tìm thấy nó ở bất cứ đâu. Hy vọng một số guru generics có thể giúp đỡ.Phương pháp chung với hành động <T> tham số
public interface IAnimal{}
public class Orangutan:IAnimal{}
public void ValidateUsing<T>(Action<T> action) where T : IAnimal
{
Orangutan orangutan = new Orangutan();
action(orangutan); //Compile error 1
//This doesn't work either:
IAnimal animal = new Orangutan();
action(animal); //Compile error 2
}
- loại Đối số 'Đười ươi' là không thể chuyển nhượng để tham số kiểu 'T' loại
- Đối số 'IAnimal' không thể chuyển nhượng để tham số kiểu 'T'
Edit: Dựa trên Yuriy và các đề xuất khác, tôi có thể thực hiện một số thao tác như:
public void ValidateUsing<T>(Action<T> action) where T : IAnimal
{
Orangutan orangutan = new Orangutan();
action((T)(IAnimal)orangutan);
//This doesn't work either:
IAnimal animal = new Orangutan();
action((T)animal);
}
Điều tôi muốn làm là gọi phương thức ValidateUsing như thế này:
ValidateUsing(Foo);
Thật không may, nếu foo trông như thế này:
private void Foo(Orangutan obj)
{
//Do something
}
tôi phải chỉ định rõ kiểu dữ liệu khi tôi gọi ValidateUsing
ValidateUsing<Orangutan>(Foo);
Cảm ơn bdukes, tôi chỉ sử dụng Orangutan làm ví dụ. Có lẽ là một xấu. Tôi muốn có thể gọi hành động với bất kỳ IAnimal nào. Trong mã "thực", IAnimal được lưu trữ như một trường riêng trong lớp. Vì vậy, tôi không thực sự instantiating bất cứ điều gì. –