So, I'm sure this has been answered somewhere out there before, but I couldn't find it anywhere. Hoping some generics guru can help.
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
}
- Argument type 'Orangutan' is not assignable to parameter type 'T'
- Argument type 'IAnimal' is not assignable to parameter type 'T'
Edit: Based on Yuriy and other's suggestions, I could do some casting such as:
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);
}
The thing I wanted to do was call the ValidateUsing method like this:
ValidateUsing(Foo);
Unfortunately, if foo looks like this:
private void Foo(Orangutan obj)
{
//Do something
}
I have to explicitly specify the type when I call ValidateUsing
ValidateUsing<Orangutan>(Foo);