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?
以上是内存溢出为你收集整理的c# – 为什么不引用需要引用基类的方法的派生类工作?全部内容,希望文章能够帮你解决c# – 为什么不引用需要引用基类的方法的派生类工作?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)