Выполнение CompareTo приводит к ошибке. Объект должен иметь тип int32. - PullRequest
0 голосов
/ 31 октября 2011

Возникли некоторые проблемы при сравнении двух целочисленных значений.

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

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

Я постараюсь быть максимально простым:

Это то, что вы делаете:

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 по умолчанию.Иногда этого достаточно, но имейте в виду, что вам может потребоваться создать / использовать собственный алгоритм хеширования в зависимости от ваших потребностей.
- Наконец, подумайте, что это всего лишь пример.Я создал интерфейс на основе ответа Гейба, но добавил метод только для самого хэша.Возможно, вы захотите удалить или улучшить.Учитывайте ваши потребности.

// 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(); }
}
1 голос
/ 31 октября 2011

Вы сравниваете целое число с IData объектом в строке, которая вызывает исключение. Вам необходимо привести объект IData к объекту IntegerData, а затем сравнить его свойство _data с локальным свойством _data.

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

Более элегантный подход заключается в использовании обобщений для обработки ваших случаев различного типа:

* * 1010
0 голосов
/ 31 октября 2011

otherData относится к типу IData

Вы должны добавить геттер, чтобы получить свойство 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...