是C#a = b = c; 等于b = c; 一个= C; 而C++是b = c; A = B;?

Rob*_*b L 3 c#

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

Jon*_*eet 10

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

    byte a;
    int b;
    byte c = 10;

    a = b = c; // Fails to compile
Run Code Online (Sandbox Code Playgroud)

这无法编译,因为虽然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
    }
}
Run Code Online (Sandbox Code Playgroud)

a = b = c;声明相当于:

BType tmp = c;
b = tmp;
a = tmp;
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,赋值b需要转换ACTypeBType创建BType值为50的值.然后赋值到a需要转换BTypeACType,这将创建一个ACType值为= 25的值.


And*_*ite 9

不,它在两个语言中都是 a = b = c;一样的:这样的工作:a = (b = c);.赋值运算符从右向左工作,返回的值是赋值的结果,即左侧.从概念上讲,a = b = c;与以下相同: b = c; a = b;.

对于C#,赋值运算符和条件运算符(?:)是右关联的,这意味着操作从右到左执行.例如,x = y = z被评估为x =(y = z).(来源)

与C++相同(来源)