[英]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.