1

我有一个struct复数。我希望能够运行类似的东西:

Complex a = new Complex( 3, 5 );
Console.WriteLine("|a| = {0}", |a|);

|a|可以创建吗?如果是,怎么做?

4

2 回答 2

3

可重载运算符(C# 编程指南)列出了以下可重载运算符:

C# 允许用户定义类型通过使用 operator 关键字定义静态成员函数来重载运算符。但是,并非所有运算符都可以重载,并且其他运算符有限制,如下表所示:

+, -, !, ~, ++, --, true, false
这些一元运算符可以重载。

+, -, *, /, %, &, |, ^, <<, >>
这些二元运算符可以重载。

==, !=, <, >, <=, >=
比较运算符可以重载(但请参阅此表后面的注释)。

&&, ||
条件逻辑运算符不能重载,但使用 & 和 | 求值,可以重载。

[]
数组索引运算符不能重载,但可以定义索引器。

(T)x
强制转换运算符不能重载,但您可以定义新的转换运算符(请参阅显式和隐式)。

+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
赋值运算符不能被重载,但是 +=,例如,使用 + 计算,它可以超载。

=、.、?:、??、->、=>、f(x)、as、checked、unchecked、default、delegate、is、new、sizeof、typeof
这些运算符不能重载。

您不能定义新的运算符。

于 2012-10-24T20:23:16.520 回答
0

有点,你不能使用 |a| 像上面一样的语法 - 但您可以覆盖 ToString() 方法以进行基本输出,或创建自定义属性以生成您希望输出的格式。例如,使用此类定义:

public class Complex
{
    public int Real { get; protected set; }
    public int Imag { get; protected set; }

    public Complex(int a, int b)
    {
        Real = a; Imag = b;
    }

    public override string ToString()
    {
        return string.Format("{0} + {1}i", Real, Imag);
    }

    public string AbsoluteValue
    {
        get { return string.Format("sqrt({0}² + {1}²)", Real, Imag); }
    }
}

你可以做这样的事情:

static void Main(string[] args)
{
    Complex c = new Complex(2, 6);
    Console.WriteLine(c);
    Console.WriteLine(c.AbsoluteValue);
}

要生成这样的输出:

2 + 6i
sqrt(2² + 6²)
于 2012-10-24T20:34:39.993 回答