Reputation: 15
I have a problem dealing with Generics.
Some background:
The Animal class is a generified class that needs to be associated with a particular person
Dog is an animal that can only be associated with the class Doctor (a subclass of Person)
Cat is an animal that can only be associated with the class Painter (a subclass of Person)
I need a method (named SomeMethod) that will take in new lists of animals
SomeMethod will primarily deal with the Owner property from the Animal class
using System.Collections.Generic;
namespace Test
{
class Program
{
static void Main()
{
SomeMethod(new List<Animal<Person>>(), new List<Dog>());
}
public static void SomeMethod<T>(IList<Animal<T>> a, IList<Animal<T>> b)
where T : Person
{
//do something
}
}
class Animal<T>
where T : Person
{
public T Owner { get; set; }
}
class Dog : Animal<Doctor>
{
}
class Cat : Animal<Painter>
{
}
class Person
{
}
class Doctor : Person
{
}
class Painter : Person
{
}
}
This code will not compile as SomeMethod() would not accept the 2 different lists as arguments. I will use the method to compare the "Owner" properties of each Animal. Would anybody have an idea?
Upvotes: 1
Views: 138
Reputation: 29322
What you have specified is a List<Dog>
whereby the method signature requires a List<Animal<T>>
. The method might want to add a Cat
to your list of Dog
. According to the methods signature this should legal, but your code would throw an exception as a Cat
is not a Dog
, and the List is specifically of Dog
objects, not Animal<T>
. Thus the C# compiler will refuse to compile this code.
So you have two choices:
List<Cat>
and List<Dog>
in mymethod.IList<Animal<T>>
and place Dog
objects into it to pass to your method.Upvotes: 1