C#并使用ref覆盖运算符

时间:2016-11-01 15:18:00

标签: c# override operator-keyword ref

看看这段代码:

public class classA
{
    public string something;
    public classA()
    {
        something = "aaa";
    }
}

public class classB
{
    private classA someA = new classA();

    public static implicit operator classA(classB val)
    {
       val.someA.something = "From B";
       return val.someA;
    }

}

ClassB包含ClassA,简化情况。 有一个方法(函数,你喜欢调用它)接收ClassA作为参数:

public void test( classA var)
{
    MessageBox.Show(var.something);
}

和另一个接收ClassA作为ref参数的方法:

public void testByRef( ref classA var)
{
    MessageBox.Show(var.something);
}

现在,我在ClassB中重写了运算符ClassA,因此可以使用ClassB调用第一个函数,但我不知道如何在ClassB中覆盖第二次调用的ref运算符:

    classA a = new classA();
    classB b = new classB();

    test(a);    // Works
    test(b);    // Works

    testByRef(ref a);    // Works
    testByRef(ref b);    // Does not work - error CS1503: Argument 1: cannot convert from 'ref classB' to 'ref classA'

我试过像这样重载

public static implicit operator ref classA(classB val)
{
   val.someA.something = "From B";
   return val.someA;
}

和变化,但没有成功。

是否有人遇到此问题并有解决方案?

谢谢, 莎莎卡伊奇

1 个答案:

答案 0 :(得分:2)

如果您想通过引用传递 完全类型ClassA,则需要该变量。该变量的当前值可以是ClassB的实例,但变量的类型必须为ClassA

classA a = new classA();
classA b = new classB();

testByRef(ref b);  

那将编译。这需要发生,因为testByRef可以为var分配值,并且该值可以是ClassA类型的任何值,也可能不是ClassB实例,所以你无法提供ClassB类型的变量。

隐式转换运算符将始终返回。它无法返回变量,这是您尝试在该运算符中使用ref进行的操作。没有办法支持这个。

还值得注意的是,您的testByRef方法实际上并未变异变量var,因此没有理由通过引用实际传递它。< / p>

最后,你真的不应该通过改变传入的操作数来执行你在原始隐式运算符实现中所做的事情。那就是极度让用户感到困惑;隐式运算符应该创建一个新类型的实例,而不是以任何方式更改原始对象

。。