我看到这样的代码:
double d = GetDouble();
DoSomething(+d);
DoSomething(-d);
我知道它有潜在的危险,不建议在c++中使用一元+
只是为了强调值是正的。<EDIT>
"只是为了强调值是正的"是一条心理捷径。我知道它不会让负值变成正的。</EDIT>
c#语言参考没有说太多:
一元+操作符返回其操作数的值。
有一个关于SO的问题,但它被标记为C, c++和c#,并且没有一个答案明确提到c#。
正如您所链接的问题的答案所说,C(++)中的一元+
确实做一些的事情,并且不一定是no-op。在c#中也是如此。
c#只有这些一元+
操作符(参见规范):
int operator +(int x);
uint operator +(uint x);
long operator +(long x);
ulong operator +(ulong x);
float operator +(float x);
double operator +(double x);
decimal operator +(decimal x);
因此,如果x
是short
类型,则+x
应该是int
类型,因为第一个操作符是由重载解析选择的。因此,这样的代码无法编译:
short x = 1;
short y = +x;
这也会影响重载解析。就像这个答案中给出的代码一样,如果您这样做:
public class C {
public static void Foo(int x) {
Console.WriteLine("int");
}
public static void Foo(short x) {
Console.WriteLine("short");
}
}
C.Foo(x)
,其中x
是short
,将打印short
,但C.Foo(+x)
将打印int
。
上述情况是否经常发生,使+x
成为"bad"或";unsafe"实践?那由你来决定。
当然,如果x
是自定义结构/类类型,那么+x
基本上可以做任何事情。Unary+
是可重载的
+
和-
不会改变原来的双精度值,如果这就是你所说的安全的话。
double d = 7d;
Console.WriteLine(d); //7
Console.WriteLine(+d); //7
Console.WriteLine(-d); //-7
Console.WriteLine(d); //7
//OR
d = -7d;
Console.WriteLine(d); //-7
Console.WriteLine(+d); //-7
Console.WriteLine(-d); //7
Console.WriteLine(d); //-7
其他的答案已经很好地解释了使用+
会发生什么。
只是想标记一下,就像在C/c++中一样,也有整型数值类型都有无符号版本。当然,当对它们进行错误的操作时,它们都有相同的问题
下面的代码片段只是一个笑话,不要杀了我,但是这里有一个扩展方法来检查数字类型是否为正,而不会改变原始值或键入 的风险。public static class NumericExtensions<T> where T : struct
{
public static bool IsPositive(this T num) =>
num switch
{
num is uint _ => true,
num is int i => i > 0,
num is ulong _ => true,
num is long l => l > 0,
num is double d => d > 0,
num is float f => f > 0,
num is decimal m => m > 0m
//... add remaining numeric types
_ => false //or throw exception
};
}