Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何写一个操作符?_C#_Operators - Fatal编程技术网

C# 如何写一个操作符?

C# 如何写一个操作符?,c#,operators,C#,Operators,当我调用Testa()方法时,我希望结果是5*5,但我不确定如何使用上面的方法,如果我在+运算符上写,你不能这样做。整数的+运算符重载是C语言规范的一部分,不能被用户代码覆盖 您可以执行以下操作: class Test { public int a { get; set; } public int b { get; set; } public Test(int a, int b) { this.a = a; this.b = b;

当我调用Testa()方法时,我希望结果是5*5,但我不确定如何使用上面的方法,如果我在+运算符上写,你不能这样做。整数的+运算符重载是C语言规范的一部分,不能被用户代码覆盖

您可以执行以下操作:

class Test
{
    public int a { get; set; }
    public int b { get; set; }

    public Test(int a, int b)
    {
        this.a = a;
        this.b = b;
    }

    public static int operator +(Test a)
    {
        int test = a.a*a.b;
        return test;
    }

    public void Testa()
    {
        Test t = new Test(5, 5);
        Console.WriteLine((t.a + t.b));
    }
}
这里的想法是,您正在重载
Test
类的操作符,而不是
int

在您的例子中,实际上是重载一元加号运算符,而不是二进制运算符

您的方法重载一元
+
运算符。因此,如果你写下:

public class Test
{
    public int a { get; set; }
    public int b { get; set; }

    public Test(int a, int b)
    {
        this.a = a;
        this.b = b;
    }

    public static Test operator +(Test first, Test second)
    {
        return new Test(first.a * second.a
            , first.b * second.b);
    }

    public override string ToString()
    {
        return a.ToString() + " " + b.ToString();
    }

    public void Testa()
    {
        Test t = new Test(5, 5);
        Test t2 = new Test(2, 6);
        Console.WriteLine(t + t2);
    }
}
如果要重载二进制
+
运算符,需要给出两个参数。例如:

Test t = new Test(5, 5);
Console.WriteLine(+t); // Prints 25
然后将其用作:

// I strongly suggest you don't use "a" and "b"
// as parameter names when they're already (bad) property names
public static int operator +(Test lhs, Test rhs)
{
    return lhs.a * rhs.b + lhs.b * rhs.a;    
}

为什么要将
+
操作符重载为
*
操作符?仅仅使用
*
,不是更有意义吗?你想实现什么?你的代码没有多大意义这只是一个简单的练习,所以我知道如何使用它如果你想理解一些事情,最好是明智地去做(也就是说,不要用做完全不同事情的操作符重载操作符)。OP提供的运算符重载很好-他只是没有调用它。@JonSkeet我查看了他试图获取的结果,并尽力模拟如何获取它,而不是演示如何正确使用他创建的运算符。我意识到它在技术上是一个有效的一元运算符。我仍然不清楚OP到底想做什么。@JonSkeet同意;这只是我在解释他的意图时的最佳猜测。只是出于好奇,它是否真的超载或只是定义,因为如果在这个特殊情况下没有定义,你就不能使用它。我知道这在文献中被称为重载,因为您通常重载已经为某个类定义的运算符(比如==运算符)。提前谢谢你@尼古拉·尼克:超载了。名称“+”根据参数类型有不同的含义,就像重载方法一样。@NikolaD Nick称之为重载运算符不是因为它替换现有重载,而是因为方法重载。如果有一个方法
Foo(Bar b)
并且您添加了一个新方法
Foo(Baz)
那么您只需将一个新的“重载”添加到
Foo
Foo
被称为“重载”,因为它可以根据上下文具有不同的含义。在相同的意义上,这是在
+
操作符中添加新的重载。
public static void Main()
{
    Test x = new Test(2, 3);
    Test y = new Test(4, 5);
    Console.WriteLine(x + y); // Prints 22 (2*5 + 3*4)
}