对隐式转换运算符左侧的引用

Reference to left hand side on implicit cast operator

有没有办法在重载从 int 到 A 的隐式强制转换时获取操作左侧的实例?

像这样:

public class A
{
    int myInt;
    public static implicit operator A(int x)
    {
        a.myInt = x;
    }
}

然后

A myA = new A();
myA = 2;

所以 myA.myInt2

我在互联网上进行了搜索,但找不到这个确切问题的答案。我不认为这是可能的,因为它是一个静态函数,如果你试图将两个参数放入函数中,它会抛出一个错误。另外,我可以看到,如果您尝试对空变量执行此操作(就像我这样声明它 A myA; 一样),这会给您一个错误。但是你可以在一个结构中做到这一点(因为据我所知,结构永远不能为 null - 或者不能被分配为 null - 如果我错了请纠正我)。

我只是想知道是否有某种魔法可以让我做这样的事情。

这是不可能的。隐式运算符 returns 一个值。它是由 C# 编译器生成的代码,调用该代码以获取值并以调用者指示应使用它的任何方式使用它。

值得注意的是,甚至可能 没有存储位置。如果有人写 SomeMethodThatAcceptsAnAInstance(2) 那么您就没有将隐式转换的结果存储在变量中。您还可以编写 A a = 2;,其中 a 是一个未初始化的变量,直到隐式运算符的值被设置为它,因此存储位置在调用隐式运算符时没有有效状态。

您无法获得对 myA.myInt 或任何其他左侧的引用,因为它并不总是存在。

这里是确定左侧有问题的示例:

void Foo(A a) {...}
...
Foo(2);

以上,调用 Foo(2) 需要调用您的隐式转换运算符,但它的 return 值未分配给 Fooa 参数以外的任何参数,该参数不是调用方可用的变量。

Demo.