一个变量如何同时具有两个值

本文关键字:两个 一个 变量 何同时 | 更新日期: 2023-09-27 18:19:50

我想我应该先澄清一下,我不想实现这一点。这是发生在我身上的事情,我正在努力理解这是怎么可能的,所以我可以解决它。所以我们开始。。。

我使用的是C#,.Net 4.0。代码很大,太大了,不能在这里全部忽略,但我试图解释发生了什么,希望有一个知识渊博的人会有一些想法。

在我的调用堆栈中,我有一系列通用方法,我注意到尽管值应该只是从一个传递到另一个,但它正在发生变化。好吧,那是我的第一印象。后来,我设法隔离了一个有问题的方法,在该方法中,当我停止时,我可以看到对象的同一属性的两个不同值。

public class Sample : BaseClass, ISomeInterface
{
    [XmlIgnore]
    public new Guid Id { get; set; }
} 

BaseClass和ISomeIN接口定义可能有什么重要意义

public Guid Id

所以现在,当我停止使用该泛型方法并观察Sample类型的变量data时,我可以扩展其属性,并看到Id的第一个值。但当我观看数据时。Id显示不同的值。你自己看看。

(这是一张照片,由于声誉微不足道,我无法发布。对不起)

编辑:我把它推到那里了http://picturepush.com/public/7307446

有人知道Watch窗口中的值是如何获得的吗?有什么区别?我尝试了很多不同的方法,铸造,使用反射,但我得到的值总是和你看数据时一样。Id,具有讽刺意味的是,正确的值,我期望的是另一个,难以捉摸的值。

哦,不,这不是家庭作业;)

一个变量如何同时具有两个值

new关键字隐藏基类成员。

BaseClass中的Id属性设置为virtual:

public class BaseClass : ISomeInterface
{
    public virtual Guid Id { get; set; }
}

并在Sample:中覆盖它

public class Sample : BaseClass, ISomeInterface
{
    public override Guid Id { get; set; }
}

当您在基类和实际类中定义Id时,第二个定义不会覆盖第一个,而是隐藏。这意味着Sample类实际上包含这两个定义,并且它取决于您访问的变量的静态类型。

因此:

Sample s = new Sample();
BaseClass b = (BaseClass)s;
s.Id != b.Id;

这通常不是你想要的,可能会导致非常奇怪的行为,正如你已经发现的那样:)

演示这一点的简单可编译示例:

class A {
    public int val = 5;
    public static void Main(string[] args) {
        B b = new B();
        A a = (A)b;
        Console.WriteLine(a.val); // 5
        Console.WriteLine(b.val); // 10
    }
}
class B : A {
    public int val = 10;
}

如果您已经有了这个烂摊子,并且无法正确修复,那么可以将静态类型强制转换为您想要访问的任何版本。

不要在Sample类中定义Id属性。只需从BaseClass继承即可。上面的代码应该会产生编译器警告,Sample.Id正在隐藏BaseClass.Id