我有一个struct
复数。我希望能够运行类似的东西:
Complex a = new Complex( 3, 5 );
Console.WriteLine("|a| = {0}", |a|);
|a|
可以创建吗?如果是,怎么做?
我有一个struct
复数。我希望能够运行类似的东西:
Complex a = new Complex( 3, 5 );
Console.WriteLine("|a| = {0}", |a|);
|a|
可以创建吗?如果是,怎么做?
可重载运算符(C# 编程指南)列出了以下可重载运算符:
C# 允许用户定义类型通过使用 operator 关键字定义静态成员函数来重载运算符。但是,并非所有运算符都可以重载,并且其他运算符有限制,如下表所示:
+, -, !, ~, ++, --, true, false
这些一元运算符可以重载。+, -, *, /, %, &, |, ^, <<, >>
这些二元运算符可以重载。==, !=, <, >, <=, >=
比较运算符可以重载(但请参阅此表后面的注释)。&&, ||
条件逻辑运算符不能重载,但使用 & 和 | 求值,可以重载。[]
数组索引运算符不能重载,但可以定义索引器。(T)x
强制转换运算符不能重载,但您可以定义新的转换运算符(请参阅显式和隐式)。+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
赋值运算符不能被重载,但是 +=,例如,使用 + 计算,它可以超载。=、.、?:、??、->、=>、f(x)、as、checked、unchecked、default、delegate、is、new、sizeof、typeof
这些运算符不能重载。
您不能定义新的运算符。
有点,你不能使用 |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²)