为什么属性作为参数传递时变为空?

我有一个A从中B继承的类。A有一个名为的属性Data,它是一个包含一些数据的类。还有就是BData再次继承自data.

换句话说:

class A
{
    public Data data;
}
class B : A
{
    public new BData data;
}

class Data
{
    public string id = "something";
}
class BData : Data
{
    public new string id = "something else";
}

现在,我使用一种方法从任何类中读取数据并根据数据执行一些逻辑。

public bool ReadData<T>(T element) where T : A
{
    Console.WriteLine($"Element: {element}");
    Console.WriteLine($"Element ID: {element.data.id}");
    //do some logic
}

我为它制作了一个测试元素,A然后B将它传递给这样的方法:

A a = new A();
a.data = new Data();
B b = new B();
b.data = new BData();
ReadData<A>(A);
ReadData<B>(b);

我得到的输出是这样的:

元素:A
元素 ID:某物
元素:B
元素 ID:

我不明白为什么当我传递第二个对象时,它有一个空属性。我怀疑它可能与不同的类型有关(需要从Bto 转换A?是因为我在躲藏DataBData?)但我无法弄清楚。我错过了什么吗?

是什么导致这种情况发生,我该如何解决?

怪诞的

class B : A
{
    public new BData data;
}

不会使旧data领域

class A
{
    public Data data;
}

类消失。它不会取代它,它只是隐藏它。然后

public bool ReadData<T>(T element) where T : A

将每个对象视为A. 特别是当您初始化时,Bpublic Data data(基A类的)字段未初始化,因此保持为空。然后即使你通过B了,它实际上也会尝试访问它data的类字段A

如果您将其更改B

class B : A
{
    public BData data2;
}

这个故事的寓意是:new关键字很危险,避免它。


以下是如何使用属性而不是字段来实现您想要的。像这样的东西应该工作:

class A
{
    public Data data { get; set; }
}

class B : A
{
    public new BData data {
        get {
            return (BData)base.data;
        }
        set {
            base.data = value;
        }
    }
}

但我鼓励您使用通用接口来B代替A这些技巧。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Dart/Flutter:作为参数传递时,列表中的元素字符串变为空(为什么??)

来自分类Dev

当作为参数传递时,为什么Object的属性未定义

来自分类Dev

为什么SqlConnection作为参数传递时使用引用类型?

来自分类Dev

在`matplotlib`,`scatter`中,当参数`s` <1时,圆圈变为空,为什么会这样?

来自分类Dev

为什么对象在传递意图后变为空?

来自分类Java

为什么在类之间传递对象时它变为null?

来自分类Java

为什么在类之间传递对象时它变为null?

来自分类Java

为什么在尝试调用构造函数或方法时将“ this”作为参数隐式传递?

来自分类Dev

当传递可调用对象作为参数时,为什么g ++会抱怨“之前的无效声明符”?

来自分类Dev

为什么将指针作为函数参数传递时出现分段错误?

来自分类Dev

为什么将我的委托作为参数传递给方法时不起作用?

来自分类Dev

为什么将数组的大小作为参数传递给函数时,数组的大小为何不同

来自分类Dev

为什么有时需要在将对象作为参数传递之前创建变量

来自分类Dev

为什么将指针作为参数传递时内存分配失败

来自分类Dev

为什么作为模板参数传递时继承无效的类型不会被拒绝?

来自分类Dev

当对象作为参数传递时,为什么不调用我的自定义构造函数?

来自分类Dev

当将空列表作为函数的默认参数时,python为什么会显示此行为?

来自分类Dev

当作为参数传递时,来自 jQuery 的字符串值变为未定义

来自分类Dev

将EditText作为参数传递时,空引用异常

来自分类Dev

为什么Redux示例将空对象作为第一个Object.assign()参数传递?

来自分类Dev

分配属性时,必须将哈希作为参数传递

来自分类Dev

Python:将方法作为函数参数传递时的属性错误

来自分类Dev

导航时 ViewModel 的属性变为空

来自分类Dev

为什么不能将数组(数组内)作为参数传递?

来自分类Dev

为什么不能传递string *而不是string []作为参数?

来自分类Dev

为什么我的函数会覆盖作为参数传递的列表?

来自分类Dev

为什么不能将常量数组作为参数传递?

来自分类Dev

为什么LayoutInflater.inflate返回作为参数传递的根?

来自分类Dev

为什么我们不能在 JavaFX 中将属性作为参数传递给 Property#unbind()?

Related 相关文章

  1. 1

    Dart/Flutter:作为参数传递时,列表中的元素字符串变为空(为什么??)

  2. 2

    当作为参数传递时,为什么Object的属性未定义

  3. 3

    为什么SqlConnection作为参数传递时使用引用类型?

  4. 4

    在`matplotlib`,`scatter`中,当参数`s` <1时,圆圈变为空,为什么会这样?

  5. 5

    为什么对象在传递意图后变为空?

  6. 6

    为什么在类之间传递对象时它变为null?

  7. 7

    为什么在类之间传递对象时它变为null?

  8. 8

    为什么在尝试调用构造函数或方法时将“ this”作为参数隐式传递?

  9. 9

    当传递可调用对象作为参数时,为什么g ++会抱怨“之前的无效声明符”?

  10. 10

    为什么将指针作为函数参数传递时出现分段错误?

  11. 11

    为什么将我的委托作为参数传递给方法时不起作用?

  12. 12

    为什么将数组的大小作为参数传递给函数时,数组的大小为何不同

  13. 13

    为什么有时需要在将对象作为参数传递之前创建变量

  14. 14

    为什么将指针作为参数传递时内存分配失败

  15. 15

    为什么作为模板参数传递时继承无效的类型不会被拒绝?

  16. 16

    当对象作为参数传递时,为什么不调用我的自定义构造函数?

  17. 17

    当将空列表作为函数的默认参数时,python为什么会显示此行为?

  18. 18

    当作为参数传递时,来自 jQuery 的字符串值变为未定义

  19. 19

    将EditText作为参数传递时,空引用异常

  20. 20

    为什么Redux示例将空对象作为第一个Object.assign()参数传递?

  21. 21

    分配属性时,必须将哈希作为参数传递

  22. 22

    Python:将方法作为函数参数传递时的属性错误

  23. 23

    导航时 ViewModel 的属性变为空

  24. 24

    为什么不能将数组(数组内)作为参数传递?

  25. 25

    为什么不能传递string *而不是string []作为参数?

  26. 26

    为什么我的函数会覆盖作为参数传递的列表?

  27. 27

    为什么不能将常量数组作为参数传递?

  28. 28

    为什么LayoutInflater.inflate返回作为参数传递的根?

  29. 29

    为什么我们不能在 JavaFX 中将属性作为参数传递给 Property#unbind()?

热门标签

归档