Generics C#泛型问题
我在处理泛型方面有问题 一些背景: Animal类是一个泛化类,需要与特定的人关联 狗是一种只能和医生(人的一个亚类)联系在一起的动物 猫是一种只能与画师类(人的一个子类)联系在一起的动物 我需要一个方法(名为SomeMethod)来接收新的动物列表 SomeMethod主要处理Animal类中的Owner属性Generics C#泛型问题,generics,Generics,我在处理泛型方面有问题 一些背景: Animal类是一个泛化类,需要与特定的人关联 狗是一种只能和医生(人的一个亚类)联系在一起的动物 猫是一种只能与画师类(人的一个子类)联系在一起的动物 我需要一个方法(名为SomeMethod)来接收新的动物列表 SomeMethod主要处理Animal类中的Owner属性 using System.Collections.Generic; namespace Test { class Program { static vo
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#编译器将拒绝编译此代码
所以你有两个选择:
列表
和列表
IList
并将Dog
对象放入其中以传递给您的方法您指定的是一个
列表
,其中方法签名需要一个列表
。该方法可能希望将Cat
添加到Dog
列表中。根据方法签名,这应该是合法的,但是您的代码会抛出一个异常,因为猫
不是狗
,并且该列表特别是狗
对象,而不是动物
。因此,C#编译器将拒绝编译此代码
所以你有两个选择:
列表
和列表
IList
并将Dog
对象放入其中以传递给您的方法解释你想要这个方法做什么-例如,它是不是意味着根据人的类型过滤动物列表,并且只在适当的情况下分配?你忘记了一个关键的细节:问题是什么?告诉你的老师,这是一个非常糟糕的(ab)使用泛型的方法。我不是一个真正的学生。上面的代码将在实际项目中使用。当然,他们不是真正的猫和狗。我改了班名。我不确定我是否做出了合理的陈述,因为狗和猫与医生和画家没有真正的关系。无论如何,我们是否走得太远了?我们应该完全避免使用泛型吗?老实说,我想知道泛型对于强类型来说是一件非常好的事情,但只能在它们有意义的地方使用。如果您的代码不需要任何强制转换,并且您觉得编译器正在帮助您编写更好的代码,那么您可能正在很好地使用它。但是就像OOP中的任何东西一样,仅仅因为你能做一些事情并不意味着你应该做。解释一下你想要这个方法做什么——例如,它是不是意味着根据人的类型过滤动物列表,并且只在适当的情况下分配?你忘了一个关键的细节:问题是什么?告诉你的老师这是一个非常糟糕的方法(ab)使用泛型。我不是一个真正的学生。上面的代码将在实际项目中使用。当然,他们不是真正的猫和狗。我改了班名。我不确定我是否做出了合理的陈述,因为狗和猫与医生和画家没有真正的关系。无论如何,我们是否走得太远了?我们应该完全避免使用泛型吗?老实说,我想知道泛型对于强类型来说是一件非常好的事情,但只能在它们有意义的地方使用。如果您的代码不需要任何强制转换,并且您觉得编译器正在帮助您编写更好的代码,那么您可能正在很好地使用它。但是就像OOP中的任何东西一样,仅仅因为你可以做一些事情并不意味着你应该做。我可以补充一下,如果你不特别需要列表函数,你应该传递IEnumerable函数。通过这种方式,您可以传入linq查询,也可以传入任何动物集合,而不仅仅是可以枚举的列表。如果您不特别需要列表函数,您应该传入IEnumerable函数。通过这种方式,您可以传入linq查询,也可以传入任何动物集合,而不仅仅是列表,只要它可以枚举。