2012-06-05 6 views
0

다음 Winforms 계층 구조가 있습니다.파생 된 WinForm의 이상한 null 가능 멤버

Form ==> AForm ==> BForm 

는 그리고 AForm에 정의 된 널 수 멤버 int? X;있다. 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은 0입니다 (어쩌면 10 회마다 한 번). 조건부 휴가가 return zz==0입니다.

중단 점에 도달하면. 디버그는

X: z: 0 

쓰기하지만 브레이크 포인트가 히트 한 후 내가 비주얼 스튜디오에서 X에 마우스 커서를 가져 가면 X의 값은 null이나 0도이다.

+1

어쨌든 X 값에 어딘가에 '0'이 명시 적으로 지정되어있는 것이 당연한가? –

+0

@ChrisSinclair 아니, 불가능합니다. 중단 점에 도달하면 X가 null입니다. – ca9163d9

+0

@NickW : 맞을 때 'Y'의 값은 '0'이지만 'X' *는'null '이 아닙니다. 그렇지 않니? – Tigran

답변

0

X이 null 허용 - 즉 int? X 인 경우 X.Value을 통해 값을 가져옵니다. (int)X - -

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

선택적으로, 당신은 X 캐스트 할 수 있지만 X.HasValue 경우 먼저 확인하고 싶은 것 : 당신은 또한 확인할 수 있습니다. 그렇지 않으면 X가 아직 초기화되지 않은 경우 null 예외가 발생합니다.

0

BForm 자체의 초기화를 확인하십시오. BForm이 AForm에서 값을 상속 받았기 때문에 그 값이 다른 AForm 객체의 실제 값을 보유한다는 의미는 아닙니다. 직접 값을 설정하지 않는 한.

BForm 인스턴스가 생성되는 방법과 관련이 있습니다. 이런 식으로 뭔가 :이 경우에

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

또는

BForm B = new AForm(someValueForX); 

, B.X는 A.X와 같은 값을 가지고 있고, 상속 할당이 허용되어야 규칙 것입니다. 그러나 X가 선언의 어딘가에서 초기화되지 않으면 X가 다른 BOM 인스턴스에서 값을 가질 수있을지라도,보고있는 BForm의 특정 인스턴스에 대한 값이 없습니다.

관련 문제