Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 派生WinForm中奇怪的可空成员_C#_Winforms - Fatal编程技术网

C# 派生WinForm中奇怪的可空成员

C# 派生WinForm中奇怪的可空成员,c#,winforms,C#,Winforms,我有以下Winforms层次结构 Form ==> AForm ==> BForm 并且有一个空的可启用成员int?X;在AForm中定义。在BForm中,有以下代码 public partial class BForm : AForm, IBview { ...... public int Y { get { int z = X ?? 0; System.Diagnostics

我有以下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不应该为null。我正在尝试关闭和打开表单BForm。它通常是有效的,偶尔z为零,可能每10次一次。我有一个条件换行符,在返回z的行中,它是z==0

当到达断点时。调试写入

    X:  z: 0
但是,当我在visual studio中点击断点后将鼠标光标悬停在X上时,X的值既不是null也不是0。

如果X可为null-即int?然后,通过X.value获得它的值。您还可以检查:

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

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

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

它与BForm实例的创建方式有关。大概是这样的:

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


在这些情况下,B.X将具有与A.X相同的值,并且使用继承规则应该允许赋值。但是,如果X没有在声明中的某个地方初始化,那么对于您正在查看的BForm的特定实例,X将没有值,即使它可能在其他某个AForm实例中有值。

愚蠢的问题,X的值在某个地方被显式指定为0是否合理?@chrisnclair,不,不可能。当到达断点时,X是空的。@NickW:但是你刚才说当它到达断点时,Y的值是0,但是X不是空的。不是吗?但在你的问题中你说:当我检查时,X的值不是空的。所以如果X为null,z为0;另外,如果X为0,则z也为0。X有两个条件可能导致z为0。请小心使用条件断点,如果键入错误,它们可能会修改值,即意外写入X=null而不是X==null或其他内容。否则,请在X上查找所有引用,并在其被修改的地方放置断点。
BForm B = new AForm(someValueForX);