【发布时间】:2016-11-01 15:18:00
【问题描述】:
看看这段代码:
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;
}
和变化,但没有成功。
有没有人遇到过这个问题并有解决办法?
谢谢, 萨萨卡伊奇
【问题讨论】:
-
对
b的operator classA(classB val)的返回值的引用绝不是对b的引用。假装它是只会引起混淆,因为您将它传递给它的方法将改变一个临时值,该值将在方法返回时消失。然后你会在这里问我们是否有解决那个问题的方法。如果看起来像f(ref b)的东西实际上是f(lolwut),这对任何人都没有好处 -
如你所见,ClassB 中的 someA 不是临时的,也永远不会是。
-
我需要来自 B 的 ref,因为我希望它被更改并且仍然是 B 的一部分,所以单独的 'afromb' 不是解决方案。
-
它是临时的,因为您正在从一个隐式转换到另一个,您无法引用它,因为它不再以该形式存在。
-
正如您应该能够推断的那样,C# 设计团队并不认为编译器的工作是分析运算符并为您找出答案。
标签: c# overriding operator-keyword ref