假设您有以下Generic类heirarchy:
public abstract class GenericBase<T>
{
T SomeProperty{ get; set; }
}
public class Foo<T>
{
T SomeProperty{ get; set; }
}
public abstract class GenericChild<T> : GenericBase<T>
{
// ...
public bool DoSomething(Foo<T> foo)
{
// This is invalid:
return SomeProperty == foo.SomeProperty;
}
}
DoSomething方法中的相等检查将无法编译。它会产生以下错误:
Operator '==' cannot be applied to operands of type 'T' and 'T'
如果它是相关的,这些类是在单独的文件中。允许这种平等比较的最佳解决方法是什么?是否有某种模式或某些东西允许在C#中使用?
更新
一些答案建议使用:
where T : SomeClass
不幸的是,T经常是原始类型。
答案 0 :(得分:8)
==
通常不适用于所有类型。如果 T被约束为支持它的类型,例如where T : class
,则只能使用。但是,使用Equals
方法可能会更好。
return SomeProperty.Equals(foo.SomeProperty);
应用适用的空检查。
答案 1 :(得分:2)
试试这个:
public abstract class GenericBase<T>
where T : IEquatable<T>
{
public T SomeProperty { get; set; }
}
public class Foo<T>
{
public T SomeProperty { get; set; }
}
public abstract class GenericChild<T> : GenericBase<T>
where T : IEquatable<T>
{
// ...
public bool DoSomething(Foo<T> foo)
{
// This is valid:
return SomeProperty.Equals(foo.SomeProperty);
}
}
C#不知道==是否可以应用于T.
答案 2 :(得分:1)
如果你想这样做,你必须提示T是哪种类型。
例如:
public abstract class GenericBase<T> where T : MyClass
{
T SomeProperty{ get; set; }
}
public class Foo<T> where T : MyClass
{
T SomeProperty{ get; set; }
}
public abstract class GenericChild<T> : GenericBase<T> where T : MyClass
{
}
在MyClass类中,您可以实现IEquatable接口,这样就可以SomeProperty.Equals(foo.SomeProperty)
如果你没有添加where约束,你仍然可以使用object.Equals
答案 3 :(得分:0)
如果要比较T类型的对象,可以使用IEqualityComparer接口(比较给定类型的给定对象)或强制T实现IEquatable(允许将对象与T类型的对象进行比较)