Hey everyone --
Curious about some strange behaviour I'm seeing that seems to be
related to my lack of understanding on how generics work in C#. Here's
some simplified code (sorry for strange formatting) to show what my
issue is.
I have a generic abstract class here:
public abstract class MyGenericAbstra ctClass<Twhere T : MyInterface
{
//...whatever...
T _internal_inter face;
public MyGenericAbstra ctClass(T internal_var)
{
_internal_inter face = internal_var;
}
}
and I have classes that inherit from it, such as
public class MyDerived :
MyGenericAbstra ctClass<Somethi ngThatImplement sMyInterface>
{
///...whatever...
public MyDerived(Somet hingThatImpleme ntsMyInterface internal_var) :
base(internal_v ar) { }
}
My problem comes when I try to pass my "MyDerived" objects to another
class, defined as such:
public class MyBrokenClass
{
// here I have a list of MyGenericAbstra ctClass objects
private
System.Collecti ons.Generic.Lin kedList<MyGener icAbstractClass <MyInterface> >
_list_of_object s;
public void
AddMyGenericAbs tractClassToPri vateLinkedList( MyGenericAbstra ctClass<MyInter face>
object_to_add)
{
_list_of_object s.AddLast(objec t_to_add);
}
}
All of this compiles just fine.
When I try to do something like this though:
SomethingThatIm plementsMyInter face my_something = new
SomethingThatIm plementsMyInter face();
MyDerived my_derived = new MyDerived(my_so mething);
MyBrokenClass my_broken = new MyBrokenClass() ;
my_broken.AddMy GenericAbstract ClassToPrivateL inkedList(my_de rived);
Then I get a compile time error as follows:
Error 1:
The best overloaded method match for
'MyBrokenClass. AddMyGenericAbs tractClassToPri vateLinkedList( MyGenericAbstra ctClass<MyInter face>)'
has some invalid arguments
Error 2:
Argument '1': cannot convert from 'MyDerived' to
'MyGenericAbstr actClass<MyInte rface>'
So, what's the story? What have I done wrong?
Thanks kindly.
Mustafa
Curious about some strange behaviour I'm seeing that seems to be
related to my lack of understanding on how generics work in C#. Here's
some simplified code (sorry for strange formatting) to show what my
issue is.
I have a generic abstract class here:
public abstract class MyGenericAbstra ctClass<Twhere T : MyInterface
{
//...whatever...
T _internal_inter face;
public MyGenericAbstra ctClass(T internal_var)
{
_internal_inter face = internal_var;
}
}
and I have classes that inherit from it, such as
public class MyDerived :
MyGenericAbstra ctClass<Somethi ngThatImplement sMyInterface>
{
///...whatever...
public MyDerived(Somet hingThatImpleme ntsMyInterface internal_var) :
base(internal_v ar) { }
}
My problem comes when I try to pass my "MyDerived" objects to another
class, defined as such:
public class MyBrokenClass
{
// here I have a list of MyGenericAbstra ctClass objects
private
System.Collecti ons.Generic.Lin kedList<MyGener icAbstractClass <MyInterface> >
_list_of_object s;
public void
AddMyGenericAbs tractClassToPri vateLinkedList( MyGenericAbstra ctClass<MyInter face>
object_to_add)
{
_list_of_object s.AddLast(objec t_to_add);
}
}
All of this compiles just fine.
When I try to do something like this though:
SomethingThatIm plementsMyInter face my_something = new
SomethingThatIm plementsMyInter face();
MyDerived my_derived = new MyDerived(my_so mething);
MyBrokenClass my_broken = new MyBrokenClass() ;
my_broken.AddMy GenericAbstract ClassToPrivateL inkedList(my_de rived);
Then I get a compile time error as follows:
Error 1:
The best overloaded method match for
'MyBrokenClass. AddMyGenericAbs tractClassToPri vateLinkedList( MyGenericAbstra ctClass<MyInter face>)'
has some invalid arguments
Error 2:
Argument '1': cannot convert from 'MyDerived' to
'MyGenericAbstr actClass<MyInte rface>'
So, what's the story? What have I done wrong?
Thanks kindly.
Mustafa
Comment