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

换句话说,C#operator =将返回正确的值,不是吗?但是C通常返回左值,对吗?
最佳答案
不,赋值表达式的结果是赋值,而不是右边的表达式.所以考虑一下:

    byte a;
    int b;
    byte c = 10;

    a = b = c; // Fails to compile

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

根据C#4语言规范的7.17.1节:

The result of a simple assignment expression is the value assigned to the left operand. The result has the same type as the left operand and is always classified as a value.

编辑:这证明使用的是分配给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的赋值需要从ACType到BType的转换,这将创建一个Value = 50的BType.然后,分配给a需要从BType到ACType的转换,这将创建一个Value = 25的ACType.

转载注明原文:是C#a = b = c;等于b = c;一个= C;而C为b = c; A = B;? - 代码日志