C#泛型问题

时间:2010-01-20 08:45:07

标签: generics

我在处理泛型时遇到问题。

一些背景知识:

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的“所有者”属性。有人会有想法吗?

1 个答案:

答案 0 :(得分:1)

您指定的是List<Dog>,其中方法签名需要List<Animal<T>>。该方法可能希望在Cat列表中添加Dog。根据方法签名,这应该是合法的,但是您的代码会抛出异常,因为Cat不是Dog,而List特别是Dog个对象,而不是Animal<T> }。因此C#编译器将拒绝编译此代码。

所以你有两个选择:

  1. 指定mymethod中有List<Cat>List<Dog>
  2. 创建IList<Animal<T>>并将Dog个对象放入其中以传递给您的方法。