Das ist kein Feature, das ist Type Erasure
. Dank der sind Typsicherheit und Generics zwei unvereinbare Dinge. C# bietet ab 4.0 dagegen über Ko-/Kontravarianz einen vernünftigen Weg an:
Code:
class Base { }
class Derived : Base { }
interface IGeneric<out T>
where T : Base
{
T Foo { get; }
}
...
IGeneric<Derived> a = ...;
Console.WriteLine(a is IGeneric<Base>); // True
var b = (IGeneric<Base>)a;