换句话说,C# operator= 将返回正确的值,不是吗?但是 C++ 通常返回左值,对吧?

最佳答案

不,赋值表达式的结果是赋值的值,而不是右边的表达式。所以考虑一下:

    byte a;
    int b;
    byte c = 10;

    a = b = c; // Fails to compile

这将无法编译,因为尽管 b = c 有效,但它是 int 类型的表达式,然后不能将其分配给 a 类型的 byte

来自 C# 4 语言规范,第 7.17.1 节:



编辑:这里证明它是分配给 b 使用的值,而不是 c 的值:
using System;

class ACType
{
    public int Value { get; set; }

    public static implicit operator BType(ACType ac)
    {
        return new BType { Value = ac.Value / 2 };
    }
}

class BType
{
    public int Value { get; set; }

    public static implicit operator ACType(BType b)
    {
        return new ACType { Value = b.Value / 2 };
    }
}

class Test
{
    static void Main()
    {
        ACType a, c;
        BType b;

        c = new ACType { Value = 100 };
        a = b = c;

        Console.WriteLine(a.Value); // Prints 25
    }
}
a = b = c; 语句等效于:
BType tmp = c;
b = tmp;
a = tmp;

所以之后不会读取 b 的值(它不等同于 b = c; a = b; )——所以如果 b 实际上是一个属性,那么除了副作用之外,该属性的行为将无关紧要。它是分配给 b 时使用的任何值,也用于分配给 a 的值。

在这种情况下,对 b 的赋值需要从 ACTypeBType 的转换,这会创建一个 Value=50 的 BType。对 a 的赋值需要从 BTypeACType 的转换,这会创建一个 Value=25 的 ACType

10-08 15:10