0

我有以下 Winforms 层次结构。

Form ==> AForm ==> BForm

int? X;并且在 中定义了一个可以为空的成员AForm。在 中BForm,有以下代码。

public partial class BForm : AForm, IBview
{
    ......
    public int Y
    {
        get
        {
            int z = X ?? 0;
            System.Diagnostics.Debug.WriteLine("X: " + X.ToString() + " z: " + z.ToString());
            return z;
        }
    }

X不应该为空。我正在尝试关闭并打开表单BForm。它通常有效,偶尔z为零(可能每 10 次一次)。我有一个z==0在线的有条件休息return z

当击中断点时。调试写入

    X:  z: 0

但是,当我在中断点被击中后将X鼠标光标悬停在 Visual Studio 中时,值既不是 null 也不是 0 。X

4

2 回答 2

0

检查 BForm 本身的初始化。仅仅因为 BForm 继承了 AForm 的值,这并不意味着这些值具有来自其他 AForm 对象实例的物理值,除非您自己设置这些值

它与 BForm 实例的创建方式有关。像这样的东西:

AForm A = new Aform(someValueForX);
BForm B = A;

或者

BForm B = new AForm(someValueForX);

在这些情况下,BX 将具有与 AX 相同的值,并且应允许使用继承规则进行分配。但是,如果 X 没有在声明中的某处初始化,那么 X 对于您正在查看的 BForm 的特定实例将没有任何值,即使它可能在 AForm 的某个其他实例中具有值。

于 2012-06-05T20:43:06.867 回答
0

如果X可以为空 - 即int? X- 那么,它的值是通过X.Value. 您还可以检查:

int z = X.HasValue ? X.Value : 0;

或者,您可以强制转换X- (int)X- 但您需要先检查是否X.HasValue。否则,如果 X 尚未初始化,我相信你会得到一个空异常。

于 2012-06-05T20:00:44.607 回答