如何比较两个泛型类型?

4

我将我的类设为泛型。T可以是字符串或整数。

我有这个特征类:

public class Feature<T>// : IComparable
{
    public T CurrentFeatureCode { get; set; }

    public T StreetCode1 { get; set; }
    public T BuildingNumber1 { get; set; }
    public string BuildingLetter1 { get; set; }

    public T StreetCode2 { get; set; }
    public T BuildingNumber2 { get; set; }
    public string BuildingLetter2 { get; set; }

    public double CoordinateX { get; set; }
    public double CoordinateY { get; set; }

    public string Filter { get; set; }

    public string ToString(T streetCode)
    {
        return StreetCode2 == streetCode ? String.Format("{0}{1}", BuildingNumber2, BuildingLetter2) : String.Format("{0}{1}", BuildingNumber1, BuildingLetter1);
    }
}

如您所见,我在Feature类中有一个ToString方法来比较两个值:

StreetCode2 == streetCode ? String.Format("{0}{1}", BuildingNumber2, BuildingLetter2) : String.Format("{0}{1}", BuildingNumber1, BuildingLetter1);

我在这一行遇到了错误:

Error   11  Operator '==' cannot be applied to operands of type 'T' and 'T' .

我的问题是如何比较两个T类型的值?

int streetCode is not T StreetCode - CSharpie
@CSharpie 谢谢,这是一个错误。 - Michael
@ZoharPeled:嗯,可能存在子类关系,但是Streetcode2streetCode都与类型T兼容。这里只有一个T类型 - 它不像ToString是引入新类型参数的泛型。 - Jon Skeet
你想进行特性比较吗? - CSharpie
@JonSkeet 嗯,我读了几遍才明白你的意思,以及我的错误在哪里。 - Zohar Peled
显示剩余2条评论
3个回答

3
如果您对默认比较器感到满意,那么您可以这样做:

public class Feature<T>// : IComparable
{
    public T StreetCode2 { get; set; }
    public string ToString(T streetCode)
    {
        if (EqualityComparer<T>.Default.Equals(StreetCode2, streetCode))
        {
            return "Equal";
        }

        return "Not Equal";
    }
}

以下是一个测试:

var feature1 = new Feature<string>();
feature1.StreetCode2 = "two";
string equals = feature1.ToString("two");

3

针对您的类型T,实现IEquatable<T>接口。重写Equals()方法并编写适合您情况的逻辑。请注意,您还必须重写GetHashCode()方法。


1

我认为推荐的方法是使用泛型和Equals()方法来实现IEquatable接口,但我不确定是否符合您的口味。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接