gpt4 book ai didi

c# - 为什么派生类的引用不能用于需要基类引用的方法?

转载 作者:太空狗 更新时间:2023-10-29 18:07:58 26 4
gpt4 key购买 nike

我在下面收到编译器错误。我不知道为什么我不能引用派生类并将其传递给引用基类的方法。请注意,方法 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?

关于c# - 为什么派生类的引用不能用于需要基类引用的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1642868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com