隐式强制转换运算符

时间:2017-12-18 20:31:50

标签: c# operators implicit-conversion

有什么方法可以在将隐式转换从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 - 如果我错了,请纠正我。)

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

2 个答案:

答案 0 :(得分:4)

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

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

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

在上面,调用Foo(2)需要调用隐式转换运算符,但其返回值不会分配给Foo的{​​{1}}参数以外的任何值,这不是一个变量在来电者中可用。

Demo.

答案 1 :(得分:3)

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

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