Generics C#泛型问题

Generics C#泛型问题,generics,Generics,我在处理泛型方面有问题 一些背景: Animal类是一个泛化类,需要与特定的人关联 狗是一种只能和医生(人的一个亚类)联系在一起的动物 猫是一种只能与画师类(人的一个子类)联系在一起的动物 我需要一个方法(名为SomeMethod)来接收新的动物列表 SomeMethod主要处理Animal类中的Owner属性 using System.Collections.Generic; namespace Test { class Program { static vo

我在处理泛型方面有问题

一些背景:

Animal类是一个泛化类,需要与特定的人关联

狗是一种只能和医生(人的一个亚类)联系在一起的动物

猫是一种只能与画师类(人的一个子类)联系在一起的动物

我需要一个方法(名为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
    {

    }

}
使用System.Collections.Generic;
名称空间测试
{
班级计划
{
静态void Main()
{
SomeMethod(newlist(),newlist());
}
公共静态方法(IList a、IList b)
式中T:人
{
//做点什么
}
}
类动物
式中T:人
{
公共T所有者{get;set;}
}
狗类:动物
{
}
类别猫:动物
{
}
班主任
{
}
班主任:人
{
}
班级:个人
{
}
}

此代码不会编译,因为SomeMethod()不接受两个不同的列表作为参数。我将使用该方法比较每只动物的“主人”属性。有人有主意吗?

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

所以你有两个选择:

  • 指定mymethod中有一个
    列表
    列表
  • 创建一个
    IList
    并将
    Dog
    对象放入其中以传递给您的方法

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

    所以你有两个选择:

  • 指定mymethod中有一个
    列表
    列表
  • 创建一个
    IList
    并将
    Dog
    对象放入其中以传递给您的方法

  • 解释你想要这个方法做什么-例如,它是不是意味着根据人的类型过滤动物列表,并且只在适当的情况下分配?你忘记了一个关键的细节:问题是什么?告诉你的老师,这是一个非常糟糕的(ab)使用泛型的方法。我不是一个真正的学生。上面的代码将在实际项目中使用。当然,他们不是真正的猫和狗。我改了班名。我不确定我是否做出了合理的陈述,因为狗和猫与医生和画家没有真正的关系。无论如何,我们是否走得太远了?我们应该完全避免使用泛型吗?老实说,我想知道泛型对于强类型来说是一件非常好的事情,但只能在它们有意义的地方使用。如果您的代码不需要任何强制转换,并且您觉得编译器正在帮助您编写更好的代码,那么您可能正在很好地使用它。但是就像OOP中的任何东西一样,仅仅因为你能做一些事情并不意味着你应该做。解释一下你想要这个方法做什么——例如,它是不是意味着根据人的类型过滤动物列表,并且只在适当的情况下分配?你忘了一个关键的细节:问题是什么?告诉你的老师这是一个非常糟糕的方法(ab)使用泛型。我不是一个真正的学生。上面的代码将在实际项目中使用。当然,他们不是真正的猫和狗。我改了班名。我不确定我是否做出了合理的陈述,因为狗和猫与医生和画家没有真正的关系。无论如何,我们是否走得太远了?我们应该完全避免使用泛型吗?老实说,我想知道泛型对于强类型来说是一件非常好的事情,但只能在它们有意义的地方使用。如果您的代码不需要任何强制转换,并且您觉得编译器正在帮助您编写更好的代码,那么您可能正在很好地使用它。但是就像OOP中的任何东西一样,仅仅因为你可以做一些事情并不意味着你应该做。我可以补充一下,如果你不特别需要列表函数,你应该传递IEnumerable函数。通过这种方式,您可以传入linq查询,也可以传入任何动物集合,而不仅仅是可以枚举的列表。如果您不特别需要列表函数,您应该传入IEnumerable函数。通过这种方式,您可以传入linq查询,也可以传入任何动物集合,而不仅仅是列表,只要它可以枚举。