做一个comparareto是给出一个错误对象必须是int32类型

本文关键字:一个 int32 类型 对象 comparareto 错误 | 更新日期: 2023-09-27 18:12:47

比较两个整数值有问题

public interface IData
{
  bool EqualsTo(IData otherData);
}
public class IntegerData : IData
{
  int _data;
  public IntegerData(int data)
  {
    _data = data;
  }
  public bool EqualsTo(IData otherData)
  {
    if(_data.CompareTo(otherData) == 0)
        return true;
    return false;
  }
}

我得到了一个错误的行:

if(_data.CompareTo(otherData) == 0)

说:

Object must of type int32

但是在我的手表窗口中,我可以看到两个值都是10,并且类型为int。

怎么了?

我的测试:

IData FirstData = new IntegerData(5);
 IData FirstData = new SecondData(5);
 bool result = FirstData.Value.EqualsTo(SecondData.Value);

做一个comparareto是给出一个错误对象必须是int32类型

我会尽量做到简单:

这是你正在做的:

if ( <intValue>.CompareTo(<IData object>) == 0 )
{ (...) }

这就是你需要的:

if ( <intValue>.CompareTo(<int value>) == 0 )
{ (...) }

现在,你可以这样做(非常简单的方法):

public bool EqualsTo(IData otherData)
{
   if(_data.CompareTo(otherData._data) == 0)
      return true;
   return false;
}

这是实现相同功能的另一种方法(我将在您的场景中使用):

public interface IData : IEquatable<IData> { }
public class IntegerData : IData
{
   // The value will be private for this example
   // Could be public int Value { get; private set; }
   private int Value { get; set; }
   // Constructor
   public IntegerData(int value) { Value = value; }
   // Implements Equals (from IEquatable - IData)
   public bool Equals(IData other) 
   { return Value.Equals(other.Value); }
}

这是同样任务的另一个解决方案:
-记住,这是一个比较小的问题的更大的解决方案。这可能会导致更大的类和更大的问题,所以只在需要时使用它。是简单的。保持简单。不要做太复杂的事情,因为随着时间的推移,你将不得不维护这些代码……
-还要记住,我已经使用了默认的"GetHashCode"方法。有时这就足够了,但请记住,您可能需要根据需要创建/使用自定义哈希算法。
-最后考虑到这只是一个例子。我根据Gabe的答案创建了接口,但只为哈希本身添加了一个方法。你可能想要删除或改进。考虑你的需求

// An interface that is based on IEquatable for better compatibility but also
// enables you to create a diferent EqualsTo method...
public interface IData<T> : IEquatable<T>
{
   T GetData();
   int GetDataHash();
   bool EqualsTo(IData<T> other);
}
// One class (string)
public class StringData : IData<string>
{
   private string Value { get; set; }
   public StringData(string value) { Value = value; }
   public string GetData() { return Value; }
   public int GetDataHash() { return GetData().GetHashCode(); }
   // From IEquatable
   public bool Equals(string other)
   { return Value.Equals(other); }
   // From IData (customized to compare the hash from raw value)
   public bool EqualsTo(IData<string> other)
   { return GetDataHash() == other.GetDataHash(); }
}
// Another class (int)
public class IntData : IData<int>
{
   private int Value { get; set; }
   public IntData(int value) { Value = value; }
   public int GetData() { return Value; }
   public int GetDataHash() { return GetData().GetHashCode(); }
   // Again from IEquatable
   public bool Equals(int other)
   { return Value == other; }
   // Again from IData (customized to compare just the hash code)
   public bool EqualsTo(IData<int> other)
   { return GetDataHash() == other.GetDataHash(); }
}

您正在将整数与抛出异常的行中的IData对象进行比较。您需要将IData对象转换为IntegerData对象,然后将其_data属性与本地_data属性进行比较。

if(_data.CompareTo(((IntegerData)otherData)._data) == 0) 

更优雅的方法是使用泛型来处理不同类型的情况:

    public interface IData<T>
    {
        bool EqualsTo(IData<T> otherData);
    }
    public class MyData<T> : IData<T>
    {
        private T _data;
        public MyData(T data)
        {
            _data = data;
        }
        public bool EqualsTo(IData<T> otherData)
        {
            if (_data is IComparable 
                && otherData is MyData<T> 
                && ((IComparable)_data).CompareTo(((MyData<T>)otherData)._data) == 0)
            {  
                return true;
            }
            return false;
        }
    }
    static void Main(string[] args)
    {
        MyData<int> myInts1 = new MyData<int>(5);
        MyData<int> myInts2 = new MyData<int>(5);
        MyData<int> myInts3 = new MyData<int>(10);
        MyData<string> myString1 = new MyData<string>("Hello");
        MyData<string> myString2 = new MyData<string>("Hello");
        MyData<string> myString3 = new MyData<string>("World");
        if (myInts1.EqualsTo(myInts2)) Console.WriteLine("Yay");
        if (!myInts1.EqualsTo(myInts3)) Console.WriteLine("Nay");
        if (myString1.EqualsTo(myString2)) Console.WriteLine("Yay");
        if (!myString1.EqualsTo(myString3)) Console.WriteLine("Nay");
    }

otherDataIData类型

你必须添加一个getter来获取你的int属性,所以对于interface,我添加了一个GetData()方法然后在IntegerData

中实现

像这样:

public interface IData<T>
{
  bool EqualsTo(IData otherData);
  T GetData();
}
public class IntegerData : IData<int>
{
  int _data;
  public int GetData(){
      return _data;
  }
  public IntegerData(int data)
  {
    _data = data;
  }
  public bool EqualsTo(IData otherData)
  {
    if(_data.CompareTo(otherData.GetData()) == 0)
        return true;
    return false;
  }
}