C# 为什么++;foo和foo++;当++;操作员超载了?
可能重复:C# 为什么++;foo和foo++;当++;操作员超载了?,c#,operator-overloading,increment,post-increment,pre-increment,C#,Operator Overloading,Increment,Post Increment,Pre Increment,可能重复: 我看到我可以重载++和--操作符。 通常通过两种方式使用这些运算符。增量/减增量前和增量/减增量后 例如: 但当涉及到运算符重载时,情况有点不同: class Fly { private string Status { get; set; } public Fly() { Status = "landed"; } public override string
我看到我可以重载
++
和--
操作符。
通常通过两种方式使用这些运算符。增量/减增量前和增量/减增量后
例如:
但当涉及到运算符重载时,情况有点不同:
class Fly
{
private string Status { get; set; }
public Fly()
{
Status = "landed";
}
public override string ToString()
{
return "This fly is " + Status;
}
public static Fly operator ++(Fly fly)
{
fly.Status = "flying";
return fly;
}
}
static void Main(string[] args)
{
Fly foo = new Fly();
Console.WriteLine(foo++); //outputs flying and should be landed
//why do these 2 output the same?
Console.WriteLine(++foo); //outputs flying
}
我的问题是为什么最后两行输出相同的东西?更具体地说,为什么(两行中的)第一行输出飞行
解决方案是将操作员过载更改为:
public static Fly operator ++(Fly fly)
{
Fly result = new Fly {Status = "flying"};
return result;
}
前缀和后缀
++
之间的区别在于foo++
的值是调用++
运算符之前foo
的值,而++foo
是++
运算符返回的值。在您的示例中,这两个值是相同的,因为++
运算符返回原始fly
引用。如果它返回了一个新的“飞行”飞行,那么您将看到预期的差异。可能的重复:这是一个重复,作为一般规则,重载运算符应始终返回一个新实例,而不是修改当前实例。哦,我现在得到了它,因为我正在使用引用变量。如果Fly不是类而是结构呢?那么我所写的应该是正确的吗?@Bosak它与它是引用类型还是值类型无关。这一切都与它是可变的还是不变的有关。如果Fly
是不可变的(即使作为一个类),那么这就可以了。如果它是一个可变结构,或者是一个包含引用字段的结构,那么可能会出现问题。
public static Fly operator ++(Fly fly)
{
Fly result = new Fly {Status = "flying"};
return result;
}