当我在operator +中写一个.Length时,它会出错。
为什么?
class bigint
{
private static int[] a3;
private string a;
public bigint(string a)
{
this.a = a;
}
public static bigint operator+(bigint b)
{
int max, min, q;
if (a.Length > b.a.Length)
{
max = a.Length; min = b.a.Length;
q = max - min;
for (int j = 0; j < q; j++)
{
b.a = b.a.Insert(0, "0");
}
}
else
{
max = b.a.Length; min = a.Length;
q = max - min;
for (int j = 0; j < q; j++)
{
a = a.Insert(0, "0");
}
}
}
答案 0 :(得分:1)
不幸的是,您有一些答案,但没有一个真正提供解决问题所需的代码。
C#中有两个+
运算符(就像2 -
个运算符一样,尽管一元+
的用处不大。一元版本使用单个参数来明确地将等式的右侧标识为正数,就像使用负数(即-10)一样。
要解决您的问题,您需要创建一个二元运算符:
public static bigint operator+(bigint lhs, bigint rhs)
{
//Code here
}
您收到错误的原因是必须将operator
重载定义为静态方法。静态方法与它们所定义的类的任何实例无关,所以当你说a.Length
时,它并不知道a
是什么(它确实如此,但它意识到你正在尝试使用静态方法中的实例变量/属性。)
还要意识到必须返回包含操作结果的bigint
的新实例,您应该永远直接修改操作数!为什么呢?
如果你有这样的想法:
bigint a = new bigint();
bigint b = new bigint();
bigint c = a + b;
您编写的方式,结果将存储在a
或b
中,但不会存储在c
中。这意味着您已经无法预测地修改了a
和/或b
。
考虑静态方法,例如类的扩展,它们可以与任何实例(未使用static
声明)进行对话。将a
设为静态是没有意义的,因为它必须包含bigint
的不同实例的不同值。
因此,此处的修复是简单地正确实现二进制+
运算符。通常我将它们命名为lhs
和rhs
为&#34;左手边&#34;和&#34;右手边&#34;因此,我知道哪一个操作数在哪一侧(这对于某些操作如分区很重要)。
答案 1 :(得分:0)
您的方法是static
,这意味着可以在没有bigint
类实例的情况下使用它。由于string a
是类的属性,因此您需要一个实例来使其具有值。
static
方法无法访问该类的非静态成员。
答案 2 :(得分:0)
美好的一天,
您当前收到的错误很可能是以下错误:
问题是你创建的私有变量叫做&#34; a&#34;不是静态类型,因为你想使用你的&#34; a&#34;在重载+运算符方法中的变量被标记为静态,您还需要将变量标记为静态变量,以便在静态方法中使用它。
但是你想要为&#34; bigint&#34;重置+运算符方法的整个结构。班级不正确。
请参阅MSDN的以下文章,了解如何正确地重载操作符方法: