M
MMAS
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 MyGenericAbstractClass<T> where T : MyInterface
{
//...whatever...
T _internal_interface;
public MyGenericAbstractClass(T internal_var)
{
_internal_interface = internal_var;
}
}
and I have classes that inherit from it, such as
public class MyDerived :
MyGenericAbstractClass<SomethingThatImplementsMyInterface>
{
///...whatever...
public MyDerived(SomethingThatImplementsMyInterface internal_var) :
base(internal_var) { }
}
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 MyGenericAbstractClass objects
private
System.Collections.Generic.LinkedList<MyGenericAbstractClass<MyInterface>>
_list_of_objects;
public void
AddMyGenericAbstractClassToPrivateLinkedList(MyGenericAbstractClass<MyInterface>
object_to_add)
{
_list_of_objects.AddLast(object_to_add);
}
}
All of this compiles just fine.
When I try to do something like this though:
SomethingThatImplementsMyInterface my_something = new
SomethingThatImplementsMyInterface();
MyDerived my_derived = new MyDerived(my_something);
MyBrokenClass my_broken = new MyBrokenClass();
my_broken.AddMyGenericAbstractClassToPrivateLinkedList(my_derived);
Then I get a compile time error as follows:
Error 1:
The best overloaded method match for
'MyBrokenClass.AddMyGenericAbstractClassToPrivateLinkedList(MyGenericAbstractClass<MyInterface>)'
has some invalid arguments
Error 2:
Argument '1': cannot convert from 'MyDerived' to
'MyGenericAbstractClass<MyInterface>'
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 MyGenericAbstractClass<T> where T : MyInterface
{
//...whatever...
T _internal_interface;
public MyGenericAbstractClass(T internal_var)
{
_internal_interface = internal_var;
}
}
and I have classes that inherit from it, such as
public class MyDerived :
MyGenericAbstractClass<SomethingThatImplementsMyInterface>
{
///...whatever...
public MyDerived(SomethingThatImplementsMyInterface internal_var) :
base(internal_var) { }
}
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 MyGenericAbstractClass objects
private
System.Collections.Generic.LinkedList<MyGenericAbstractClass<MyInterface>>
_list_of_objects;
public void
AddMyGenericAbstractClassToPrivateLinkedList(MyGenericAbstractClass<MyInterface>
object_to_add)
{
_list_of_objects.AddLast(object_to_add);
}
}
All of this compiles just fine.
When I try to do something like this though:
SomethingThatImplementsMyInterface my_something = new
SomethingThatImplementsMyInterface();
MyDerived my_derived = new MyDerived(my_something);
MyBrokenClass my_broken = new MyBrokenClass();
my_broken.AddMyGenericAbstractClassToPrivateLinkedList(my_derived);
Then I get a compile time error as follows:
Error 1:
The best overloaded method match for
'MyBrokenClass.AddMyGenericAbstractClassToPrivateLinkedList(MyGenericAbstractClass<MyInterface>)'
has some invalid arguments
Error 2:
Argument '1': cannot convert from 'MyDerived' to
'MyGenericAbstractClass<MyInterface>'
So, what's the story? What have I done wrong?
Thanks kindly.
Mustafa