这是一个家庭作业,我们不学习C#中的结构(我现在正在学习)。所以我去了msdn,但我找不到我的程序的问题... 是的,我无法完全转让给我的母语languange,我也不会理解编译器的想法。
我的作业的UML:(我们必须使用它) 接口:IComparable
我们不得实施其他方法或参数。
我用Java编写这个带有类的作业,并且工作正常。
我有一个大问题,我不明白以下错误是什么意思:
错误2在将控制权返回给调用者之前,必须完全分配自动实现的属性“Rational.Rational.Denominator”的后备字段。考虑从构造函数初始化程序中调用默认构造函数。
错误3在将控制权返回给调用者之前,必须完全分配自动实现的属性“Rational.Rational.Numerator”的后备字段。考虑从构造函数初始化程序中调用默认构造函数。
错误4在将所有字段分配给
之前,不能使用'this'对象我的代码: 命名空间Rational
{
// (Rational is underline) here the 2 and 3 error
public struct Rational : IComparable<Rational>
{
public long Numerator { get; set; }
public long Denominator { get; set; }
public Rational(long num, long den)
{
// and here (GCD is underline) the 4. error
long simple = GCD(num, den);
this.Numerator = num/simple;
this.Denominator = den/simple;
}
public long GCD(long a, long b)
{
long c = Math.Abs(a);
long d = Math.Abs(b);
if (d == 0) return c;
return GCD(d, c % d);
}
public override string ToString()
{
if (Denominator==1)
{
return Numerator + "";
}
return Numerator+"/"+Denominator;
}
public override bool Equals(object obj)
{
bool result = false;
if (obj is Rational)
{
Rational r = (Rational)obj;
result = this.Equals(r);
}
return result;
}
public bool Equals(Rational r)
{
if ((object)r ==null)
{
return false;
}
return this.Denominator == r.Denominator && this.Numerator == r.Numerator;
}
public int CompareTo(Rational other)
{
...
答案 0 :(得分:1)
您可以在构造函数中添加this()
,也可以用字段支持的属性替换自动属性。
public Rational(long num, long den)
{
// and here (GCD is underline) the 4. error
long simple = GCD(num, den);
this.Numerator = num;
this.Denominator = den;
}
在您为支持属性的自动生成字段指定值之前,您可以在此处访问实例方法GCD
。
您应该将此方法设为静态。
接下来,您将再次收到相同的错误,这次是因为您访问了自动属性Numerator
。您可以通过保留自动属性并将:this()
添加到构造函数来解决此问题:
public Rational(long num, long den)
:this()
{
这会导致在您自己的构造函数代码运行之前将字段初始化为0
。
替代方案是切换到字段:
public struct Rational : IComparable<Rational>
{
private long _numerator;
private long _denominator;
public long Numerator { get{return _numerator;}; set{_numerator=value;} }
public long Denominator{ get{return denominator;}; set{_denominator=value;} }
public Rational(long num, long den)
{
// and here (GCD is underline) the 4. error
long simple = GCD(num, den);
this._numerator = num;
this._denominator = den;
}
除此之外,您的代码还有更多问题:
1)你正在使用一个可变结构。这通常是糟糕的设计。从您的属性中删除setter或将其设为私有。
2)您不能覆盖GetHashCode()
以与Equals
保持一致(或者您的代码摘录中未显示)
3)我建议实施IEquatable<Rational>
。您已经实现了Equals(Rational)
,因此您无需添加任何其他方法。
4)您的代码很容易产生int溢出。请考虑使用BigInteger
而不是long
s。
5)除非你将你的理性归一化(分母> 0并且用GCD除以),否则你得到的数学上等价的理性数不能相等。
答案 1 :(得分:1)
您需要调用默认构造函数才能生效:
public Rational(long num, long den) : this()
{
// and here (GCD is underline) the 4. error
long simple = GCD(num, den);
this.Numerator = num;
this.Denominator = den;
}
这里一个更大的问题是你有一个可变的结构。这绝不是一个好主意。我会成功的:
public long Numerator {get; private set;}
答案 2 :(得分:0)
我在Rational
的构造函数中注意到您正在调用GCD并将结果存储在simple
中,但是您没有使用结果。
答案 3 :(得分:0)
将GCD
功能设为静态。
它不使用任何实例成员,并且因为它在实例成员设置之前被调用,所以它不能。