【问题标题】:How to compare two generic types? [duplicate]如何比较两种泛型类型? [复制]
【发布时间】:2018-04-17 14:06:46
【问题描述】:

我让我的类通用。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 不是T StreetCode
  • @CSharpie 感谢这是错误
  • 您无法比较它们,因为 T 可能属于不同的类型。当然,如果每种类型都可能在它的任何一侧,则不能使用==
  • 你如何使用这个类的代码在哪里?你是如何关闭通用的?那是重要的部分,你还没有展示出来。 T 是什么?
  • @ZoharPeled:嗯,可以存在子类关系,但Streetcode2streetCode 都与T 类型兼容。这里只有一个 T 类型 - 它不像 ToString 是泛型引入新的类型参数。

标签: c# .net generics


【解决方案1】:

对于您的类型T,实现IEquatable&lt;T&gt; interface。使用适合您情况的逻辑覆盖 Equals() 方法。请注意,您还必须覆盖 GetHashCode()

【讨论】:

    【解决方案2】:

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

    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】:

      我认为推荐的方法是将 IEquatable 接口与泛型和 Equals() 方法一起使用,但我不确定这是否适合您的口味。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-29
        • 1970-01-01
        • 2020-09-28
        • 1970-01-01
        • 2014-11-18
        相关资源
        最近更新 更多