现在有一个父类 RequestBase,所有的子类都继承自它。
 public abstract class RequestBase
 {
        public long Version { get; set; }
 }
 public class LoginRequest : RequestBase
 {
        public string UserName { get; set; }
 }
现在我想有一个方法,可以给所有的 类赋值属性 Uid,我尝试这样做,但是会提示 cannot convert from 'ref LoginRequest' to 'ref RequestBase'
 public void Todo() {
       LoginRequest _req = new LoginRequest();
       _req.UserName = "zhangsan";
       SetClientInfo(ref _req);
 }
  public void SetClientInfo(ref RequestBase _reqBase)
  {
            _reqBase.Version = "v3.0.0";
  }
如果强转换,会丢失掉 LoginRequest 类里面的属性; 又不希望丢失掉子类的属性值。该如何做?
|      1liujunyuan      2020-08-13 10:28:19 +08:00 如果所有子类想要共享一个成员变量的话可以使用 static 成员变量. 但和你这个报错无关,不太懂 java 的 ref 类型,我理解 java 的 ref 和 c++的指针类似,这种 pDerived 转换成 pBase 的 upcasting 应该没问题吧,我也不理解,插眼等一个大神来解释 | 
|      2yesterdaysun      2020-08-13 10:43:32 +08:00  1 难道不是吧 ref 去掉就可以了? RequestBase 本来就是引用类型的对象 | 
|      3lawler      2020-08-13 10:47:00 +08:00 public <T> void SetClientInfo(<T extends RequestBase> t) { t.Version = "v3.0.0"; } | 
|  |      4BenWang OP | 
|  |      5wysnylc      2020-08-13 11:06:57 +08:00 @liujunyuan #1 java 没有 ref 他这是 c#吧 | 
|  |      6kiracyan      2020-08-13 14:26:36 +08:00 第一次见空方法用 ref 的 直接 return 不香吗 | 
|  |      7geelaw      2020-08-13 14:30:16 +08:00  1 因为 ref RefType argName 的含义是 argName 对应一个静态类型是 RefType 的变量,且方法内对 argName 的赋值可以反映到传入 argName 的变量。显然你不能把静态类型是 Derived 的变量传入 ref Base,否则方法体内可以对 argName 赋值 new AnotherDerived,然后类型安全就会爆炸。 楼主需要认真学习 C#,值类型和引用类型的基本区别还没搞清楚。 | 
|      8foxasan      2020-08-13 17:45:01 +08:00 为什么不提成接口呢??? | 
|      9Goooler      2020-08-13 19:04:57 +08:00 方法名也能大写开头吗 |