C# 继承类作为引用

C# 继承类作为引用,c#,class,inheritance,polymorphism,pass-by-reference,C#,Class,Inheritance,Polymorphism,Pass By Reference,我想使用一个具有类型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#能做到这一点吗 --由于伪代码造成混乱而编辑的代码。(抱歉,

我想使用一个具有类型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#能做到这一点吗


--由于伪代码造成混乱而编辑的代码。(抱歉,第一篇帖子)

您必须在调用方法时使用
ref
键:

ShowData(ref myB);
实际上,中的类是引用值,因此不需要使用
ref
。当您确实希望传递引用时,仅对值类型使用
ref
short
double
decimal
bool
DateTime
等结构

在你的情况下,你只需要

object ShowData(A _myvar)
{
 ...
}

只需从方法声明中删除
ref
。像这样:

void ShowData(A _myvar)
{
 ...
}

ref
关键字

如果您可以更改
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
听起来更合适:-)

或者,更好的做法是,删除函数声明中的
ref
。也许OP想要改变调用方的引用?我还需要更新对象,这就是我需要引用的原因。但是,在C中,类作为引用类型工作,但保留在那里没有问题。在方法的调用中,您必须指定
ref
keywork作为我的第一个示例。我不认为简单地向调用添加
ref
会起作用,因为如果使用
ref
和ShowData分配一个新值,它可以将任何值分配给变量a或从中派生的变量,但它不一定与变量类型B兼容。因此,只能使用类型A的变量调用它。
函数
不是有效的C#关键字。此代码有各种各样的错误。编译器错误消息告诉您什么?为什么ref关键字不正确?解决方案不是在
函数
(OP)和
无效
(答案)之间进行替换吗?@Flater,好的,是和否。我回答时的问题在方法调用中没有
参考
,只有在声明中。在c#中,
Function
不是一个关键字,这是正确的,因此显然存在一些问题。事实上,MutateData听起来更好,我只是从我的板上复制了伪代码。事实上,“多态性”是我想要做的。你的链接似乎证实了这在c#中是不可能的;但这是一种耻辱。我会继续寻找解决办法。