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);
Why are you instantiating an
Orangutanif you are supposed to be accepting anyIAnimal?If you reuse your generic parameter, you won’t have any type issues…
Now, with regard to why your code doesn’t work, all that you’re saying is that the type
Twill derive fromIAnimal. However, it could just as easily be aGiraffeas anOrangutan, so you can’t just assign anOrangutanorIAnimalto a parameter of typeT.