0

我试图-在示例 C# 控制台应用程序中重载减号运算符,但我收到一个我不理解的错误。我正在从这本书中学习,但勘误表并未将其列为错字或错误。重载的+运算符可以正常工作,但-不能。

关于我做错了什么的任何想法?

namespace ConsoleApplication1
{
    class AddClass1
    {
        public int val;

        public static AddClass1 operator +(AddClass1 p1, AddClass1 p2)
        {
            AddClass1 returnVal = new AddClass1();
            returnVal.val = p1.val + p2.val;
            return returnVal;
        }

        public static AddClass1 operator -(AddClass1 p1)
        {
            AddClass1 returnVal = new AddClass1();
            returnVal.val = -p1.val;
            return returnVal;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            AddClass1 i = new AddClass1();
            i.val = 10;
            AddClass1 j = new AddClass1();
            j.val = 5;
            AddClass1 sum = i + j;
            AddClass1 difference = i - j;

            Console.WriteLine(sum.val);
            Console.WriteLine(difference.val);
        }
    }
}

错误

Error   1   Operator '-' cannot be applied to operands of type 'ConsoleApplication1.AddClass1' and 'ConsoleApplication1.AddClass1'  c:\users\admin\documents\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 37  36  ConsoleApplication1

在这条线上

AddClass1 difference = i - j;
4

7 回答 7

4

您需要重载二元-运算符。

public static AddClass1 operator -(AddClass1 p1, AddClass1 p2)
{
    AddClass1 returnVal = new AddClass1();
    returnVal.val = p1.val - p2.val;
    return returnVal;
}

所以你可以像这样使用它c = a + b


你所做的是一元的-

public static AddClass1 operator -(AddClass1 p1)
{
    AddClass1 returnVal = new AddClass1();
    returnVal.val = -p1.val;
    return returnVal;
}

哪个可以用这种方式

AddClass1 j = new AddClass1();
j.val = 5;
AddClass1 negative = -j;//this is what you have done
于 2013-10-21T14:59:52.807 回答
3

您没有-正确地超载您的操作员。你需要一个binary operator

public static AddClass1 operator -(AddClass1 p1, AddClass1 p2)
{
    AddClass1 returnVal = new AddClass1();
    returnVal.val = p1.val - p2.val;
    return returnVal;
}
于 2013-10-21T14:59:22.983 回答
3

你已经超载了一元减号;你应该重载二进制文件。

public static AddClass1 operator -(AddClass1 p1, AddClass1 p2)
{
    return new AddClass1 { val = p1.val-p2.val };
}
于 2013-10-21T15:00:08.710 回答
2

您重载了一元否定运算符,而不是二元减法运算符。由于您拥有的过载,您可以编写:

AddClass1 negation = -i;

甚至:

AddClass1 difference = i + (-j);

来写:

AddClass1 difference = i - j;

你需要超载

public static AddClass1 operator -(AddClass1 p1, AddClass1, p2)

操作员。

于 2013-10-21T15:00:40.290 回答
1

您的班级只有一元减号重载。因此,这将起作用:

AddClass1 difference = i + (-j);

为了让你的表达式(i - j)重载二进制减号(如二进制加号重载)

于 2013-10-21T14:59:58.840 回答
1

您没有将其定义为二元(接受两个值)运算符。你定义的是否定。尝试这个:

    public static AddClass1 operator -(AddClass1 p1, AddClass1 p2)
    {
        AddClass1 returnVal = new AddClass1();
        returnVal.val = p1.val - p2.val;
        return returnVal;
    }
于 2013-10-21T15:00:47.133 回答
0
namespace ConsoleApplication1
{
    class AddClass1
    {
        public int val;

        public static AddClass1 operator +(AddClass1 p1, AddClass1 p2)
        {
            AddClass1 returnVal = new AddClass1();
            returnVal.val = p1.val + p2.val;
            return returnVal;
        }

        public static AddClass1 operator -(AddClass1 p1, AddClass1 p2)
        {
            AddClass1 returnVal = new AddClass1();
            returnVal.val = p1.val - p2.val;
            return returnVal;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            AddClass1 i = new AddClass1();
            i.val = 10;
            AddClass1 j = new AddClass1();
            j.val = 5;
            AddClass1 sum = i + j;
            AddClass1 difference = i - j;

            Console.WriteLine(sum.val);
            Console.WriteLine(difference.val);
            Console.ReadLine();
        }
    }
}
于 2013-10-21T15:02:57.340 回答