我在下面遇到编译器错误.我不知道为什么我不能引用派生类并将其传递给一个接受基类引用的方法.请注意,方法foo()和bar()不一定具有相同的语义,因此它们应该具有不同的名称,这些方法不是问题.
public class X { public int _x; } public class Y : X { public int _y; } public class A { public void foo( ref X x ) { x._x = 1; } } public class B : A { public void bar( ref Y y ) { foo( ref y ); // generates compiler error foo( ref (X)y); // wont work either y._y = 2; } }
我找到的唯一解决方案是:
public class B : A { public void bar( ref Y y ) { X x = y; foo( ref x ); // works y._y = 2; } }
我知道“y”永远不会在bar()中初始化,但由于它声明为ref本身必须在方法之外进行初始化,因此无法解决问题.你能解决这个问题的任何照明都会有所帮助.我确信它只是我对C#缺乏的理解,这可以在C中使用强制转换.
解决方法
因为没有办法确保你不会用一个完全不同于你首先传递的类型的实例替换引用.
鉴于:
class Base {} class Hamster : Base {} class ADentist : Base {} void ohWait(ref Base obj) { obj = new ADentist(); }
以这种方式调用时:
var foo = new Hamster(); ohWait(ref foo);
会破坏性的.
Eric Lippert解释说它比我更好:
Why do ref and out parameters not allow type variation?