簡體   English   中英

做一個CompareTo給出一個錯誤對象必須是int32類型的

[英]Doing a CompareTo is giving an error Object must be of type int32

比較2個整數值時遇到問題。

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);

我將嘗試盡可能簡單:

這是您在做什么:

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");
    }

otherData的類型為IData

您必須添加一個getter來獲取您的int屬性,因此對於該interface我添加了GetData()方法,然后在IntegerData實現了該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;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM