I have the following spec to help illustrate the problem:
class when_getting_type_of_generic_argument_using_subtype_instance
{
static GenericTypeTester _gene
Just add the constrait "class" to your method :
class GenericTypeTester
{
public Type Test<T>(T dog) where T : IPet, class
{
return typeof (T);
}
}
The issue here is the type being used at runtime versus compile time.
Because you declared _dog as an IPet, the variable passed into the generic method is an IPet at compile time despite being a Dog at runtime. Thus the compiler uses IPet for the generic parameter, even though the object at runtime is a Dog. Since you used typeof(T), you get the exact type given to the generic method by the compiler.
This can be seen by changing the type of _dog to Dog instead of IPet, which will then cause the compiler to infer the correct type.
This can also be avoided by explicitly casting the object as dynamic:
() => _result = _genericTypeTester.Test(_dog as dynamic);
Which will force the compiler to hold off the type inference until runtime, at which point it will determine that the object is type Dog. This is generally not a good idea for production code, however, since dynamic types are rather slow.