做一个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);
我会尽量做到简单:
这是你正在做的:
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
像这样:
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;
}
}