C#通用类型参数跨类共享

时间:2012-01-02 19:21:28

标签: c# oop generics inheritance

假设您有以下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经常是原始类型。

4 个答案:

答案 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类型的对象进行比较)