重载赋值运算符时检查当前值

时间:2014-10-02 09:28:29

标签: c#

假设

我们假设我们有一个类似的课程......

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

    public static implicit operator SomeClass(int value)
    {
        return new SomeClass() { Value = value };
    }
}

然后我们只是简单地使用一项任务,就像这样......

SomeClass mySpecialObj = 1; /* mySpecialObj.Value is now 1 */

方案

现在,如果我为已经有引用的对象赋值,例如

SomeClass mySpecialObj = 1; // 1st assignment
mySpecialObj = 2; // 2nd assignment

问题

在第二项作业中,是否可以检查赋值运算符中的当前值?

public static implicit operator SomeClass(int value)
{
    // can I check mySpecialObj.Value here??
}

2 个答案:

答案 0 :(得分:2)

您未重载分配运算符,而是创建从intSomeClass的隐式转换。这是两个截然不同的事情。

因此,mySpecialObj = 2实际上意味着:

  1. 使用整数SomeClass
  2. 创建2的新实例
  3. 然后 将该实例分配给变量mySpecialObj
  4. ,或者

    mySpecialObj = new SomeClass{ Value = 2};
    

    到目前为止,应该清楚答案是否定的,转换操作无法知道新实例将要分配给的变量的值(如果将其分配给变量)

答案 1 :(得分:1)

你不能在C#中这样做。这样做的原因是你没有重载赋值运算符,你正在定义一个隐式转换运算符,这不是一回事。

当你这样做时

mySpecialObj = 2;

C#使用转换运算符的主体创建一个新的独立对象。在重新分配引用时,您的代码已经完成执行。您的代码无权访问所分配的变量,因为该变量不参与运算符定义的转换。实际上,您的运算符可以在赋值的上下文之外使用 - 例如,如果您执行此操作

private static void Foo(SomeClass s) {
    Console.WriteLine(s.Value);
}

隐式转换运算符的存在允许您执行此操作:

Foo(123);

现在SomeClass生成的123根本没有分配给任何变量。