我们假设我们有一个类似的课程......
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??
}
答案 0 :(得分:2)
您未重载分配运算符,而是创建从int
到SomeClass
的隐式转换。这是两个截然不同的事情。
因此,mySpecialObj = 2
实际上意味着:
SomeClass
2
的新实例
mySpecialObj
,或者
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
根本没有分配给任何变量。