I\'m trying to do this:
interface IA
{
}
class A : IA
{
}
class Foo where T: IA
{
}
class Program
{
static void Main( string[] args )
{
Sorry this is in java but you could do something like this:
interface Alpha
{
}
class Beta implements Alpha
{
}
class Foo<T>
{
}
class Program
{
static void main(string[] args)
{
Foo<Beta> fooBeta = new Foo<Beta>();
Foo<? implements Alpha> fooAlpha = fooBeta;
}
}
This doesn't solve the issue completely but you get you can at least get access to all of the Alpha methods without knowing about Beta...
All generic classes are invariant. Interfaces (and delegates) on the other hand can support co- and contra-variance, but only in the cases where it's possible safely. And they need to opt-in explicitly.
For example via IFoo<out T>
or IFoo<in T>
those classes perform operations on those base types and NEVER need to downcast them
Then why do you need a Foo<A>
to begin with? Declare it as Foo<IA>
and add A
's to it.
interface IA
{
}
class A : IA
{
}
interface IFoo<T> where T : IA
{
}
class Foo<T> : IFoo<T> where T : IA
{
}
class Program
{
static void Main(string[] args)
{
IFoo<A> fooA = new Foo<A>();
Foo<IA> fooIa = fooA as Foo<IA>;
}
}