【问题标题】:Reference to left hand side on implicit cast operator对隐式强制转换运算符左侧的引用
【发布时间】:2018-06-01 05:44:56
【问题描述】:

在将隐式转换从 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;)。但是你可以在结构中做到这一点(因为据我所知,结构不能为空 - 或者不能分配为空 - 如果我错了,请纠正我)。

我只是想知道是否有某种魔法可以让我完成这样的工作。

【问题讨论】:

  • 这就像说当我做(MyDestType)myExpr 时应该引用“the”MyDestType。但是在演员阵容发生之前没有MyDestType。在您的转换运算符主体中,首先创建一个实例作为局部变量。然后你可以根据需要修改它,最后返回它。您上面的内容不是合法的 C#。
  • 如果我重载了 = 运算符怎么办?有没有办法获得对操作左侧的引用?
  • @ItsaMeTuni 你不能重载那个操作符。

标签: c# operators implicit-conversion


【解决方案1】:

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

以下是确定左侧有问题的示例:

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

上面,调用Foo(2) 需要调用你的隐式转换运算符,但它的返回值没有分配给Fooa 参数以外的任何东西,这不是调用者中可用的变量。

Demo.

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多