Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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# 为什么++;foo和foo++;当++;操作员超载了?_C#_Operator Overloading_Increment_Post Increment_Pre Increment - Fatal编程技术网

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;
        }