C#代码,静态非静态成员,方法出错

时间:2015-10-07 17:17:12

标签: c# static-methods static-members

当我在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");
        }
    }
}

3 个答案:

答案 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;

您编写的方式,结果将存储在ab中,但不会存储在c中。这意味着您已经无法预测地修改了a和/或b

考虑静态方法,例如类的扩展,它们可以与任何实例(未使用static声明)进行对话。将a设为静态是没有意义的,因为它必须包含bigint的不同实例的不同值。

因此,此处的修复是简单地正确实现二进制+运算符。通常我将它们命名为lhsrhs为&#34;左手边&#34;和&#34;右手边&#34;因此,我知道哪一个操作数在哪一侧(这对于某些操作如分区很重要)。

答案 1 :(得分:0)

您的方法是static,这意味着可以在没有bigint类实例的情况下使用它。由于string a是类的属性,因此您需要一个实例来使其具有值。

static方法无法访问该类的非静态成员。

答案 2 :(得分:0)

美好的一天,

您当前收到的错误很可能是以下错误:

  • 非静态字段,方法或属性需要对象引用&quot; bigint.a&#39;

问题是你创建的私有变量叫做&#34; a&#34;不是静态类型,因为你想使用你的&#34; a&#34;在重载+运算符方法中的变量被标记为静态,您还需要将变量标记为静态变量,以便在静态方法中使用它。

但是你想要为&#34; bigint&#34;重置+运算符方法的整个结构。班级不正确。

请参阅MSDN的以下文章,了解如何正确地重载操作符方法: