我想使用一个类型为A的参数的函数。我想传递一个派生自A的B类。但是C#不想这样做。
class A
{
int m_a;
}
class B : A
{
int m_b;
}
void ShowandEditData( ref A _myvar)
{
...
}
现在,我想做这样的事情:
B myB = new B();
ShowandEditData(ref myB);
我尝试了许多内容,例如转换或使用base
属性。我想我做错了。
可以用C#做到吗?
- 由于伪代码造成混淆而编辑的代码。 (对不起,第一篇文章)
答案 0 :(得分:6)
只需从方法声明中删除ref
即可。像这样:
void ShowData(A _myvar)
{
...
}
答案 1 :(得分:2)
您必须在方法调用中使用ref
键工作:
ShowData(ref myB);
实际上,c#中的类是参考值,因此您无需使用ref
。仅将ref
用于值类型(int
,short
,double
,decimal
,bool
,DateTime
等结构。 。)当你真的想要传递参考时。
在您的情况下,您可以使用
object ShowData(A _myvar)
{
...
}
答案 2 :(得分:2)
ref
关键字doesn't support polymorphicism
如果你可以更改ShowData
的签名,那么我建议你改变它:
public A ShowData(A _myvar)
{
return new B(); // Or A() or whatever.
}
并且这样打电话:
B myB = new B();
myB = ShowData(myB);
或者,您需要为这两个类提供ShowData
的重载:
public void ShowData(ref A _myvar)
{
_myvar = new B();
}
public void ShowData(ref B _myvar)
{
_myvar = new B();
}
然后编译器可以选择重载:
A myA = new A();
B myB = new B();
ShowData(ref myB);
ShowData(ref myA);
顺便说一句,ShowData
并不是一个好名字。 MutateData
听起来更合适: - )