我在处理泛型时遇到问题。
一些背景知识:
Animal类是需要与特定人员相关联的一般化类
狗是一种动物,只能与类医生(人类的一个子类)相关联
Cat是一种只能与类Painter(Person的子类)相关联的动物
我需要一个方法(名为SomeMethod),它将采用新的动物列表
SomeMethod将主要处理Animal类的Owner属性
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
{
}
}
此代码不会编译,因为SomeMethod()不会接受2个不同的列表作为参数。我将使用该方法来比较每个Animal的“所有者”属性。有人会有想法吗?
答案 0 :(得分:1)
您指定的是List<Dog>
,其中方法签名需要List<Animal<T>>
。该方法可能希望在Cat
列表中添加Dog
。根据方法签名,这应该是合法的,但是您的代码会抛出异常,因为Cat
不是Dog
,而List特别是Dog
个对象,而不是Animal<T>
}。因此C#编译器将拒绝编译此代码。
所以你有两个选择:
List<Cat>
和List<Dog>
。IList<Animal<T>>
并将Dog
个对象放入其中以传递给您的方法。