2012-06-17 3 views
2

어떻게 숨겨진 인스턴스 변수에 액세스 할 수 있습니까? (int gimmeValue = shinyNewBObject.a;)? 기본 키워드를 사용하여 인스턴스에 액세스 할 수 있다는 것을 알고 있습니다. 그러나 컴파일러는 shinyNewBObject의 객체 참조를 사용하여 정적 변수를 배제 할 것이라고 생각했습니다. a의 정적 버전을 제외하면 a의 인스턴스 버전은 숨김 상태가되어 액세스 할 수있게됩니다.기본 변수없이 숨겨진 인스턴스 변수에 액세스하기 기본 키워드없이

여기 무슨 일 이니? 컴파일러는 어셈블리의 모든 ID 목록을 만들고 인스턴스 변수가 정적이기 때문에 다른 인스턴스를 제외하기 전에 숨겨져 있기 때문에 인스턴스 변수를 제외 했습니까?

class A 
{ 
    public int a; 
} 

class B : A 
{ 
    new public static int a; 

    public void m() 
    { 
     B shinyNewBObject = new B(); 
     int gimmeValue = shinyNewBObject.a; //Error 
     gimmeValue = base.a; 
    } 
} 
+0

인스턴스 변수는 정적 일 수 없습니다. –

+0

@AkashKava, 형식이 잘못되었지만 문제의 인스턴스 필드는 'A'에 있습니다. –

+0

가난한 서식에 대해 미안하다. 사이트가 그랬다고 생각한다. – greenonion

답변

1

은 내가 답을 찾은 것 같아요.

"조회 규칙의 효과는 파생 멤버가 기본 멤버를 동일한 이름이나 서명으로 숨기는 것입니다. 이러한 단일 상속 조회는 결코 모호하지 않습니다."

나는 aobj.a가 컴파일러에 의해 고려 될 때 aobj가 당분간 무시되고 그냥 고려된다고 생각합니다.

컴파일러는 모든 정적 멤버 및 인스턴스 멤버가 암시 적으로 또는 명시 적으로 있고 A 멤버로 간주되는 A 클래스 정의로 이동합니다. 둘 다 (3.5)에 기초하여 접근 할 수 있으므로 그들은 일련의 가능성을 간다. 그런 다음 숨겨진 변수가 정적 변수를 떠나 제거됩니다.

마지막으로 'aobj'가 고려되며 인스턴스 참조가 정적 변수에 액세스 할 수 없기 때문에 오류가 발생합니다.

내 이야기에 약간의 문제가있을 수 있습니다. 그렇다면 추측을하기 때문에 저를 바로 잡으십시오.

4

나는 당신이 할 수있는, 그것이이 서브 클래스의 정적 필드에 의해 가려 때 당신이 기본 유형 변수에 액세스 할 수 없지만, 그것을 해결하는 이유는 C# 사양의 어떤 부분이 지시 완전히 확실하지 않다 단지 A 캐스팅 :

나는 사양 (7.4)의 회원 룩업 섹션을 확인하는 데 필요한 :

int gimmeValue = ((A)shinyNewBObject).a; 
+0

충분한 점수가 없기 때문에 명백히 내 자신의 답변을 게시 할 수 없다. – greenonion

+1

대답을 찾은 것 같아요. 회원을 봐야했습니다. 룩업 섹션 (7.4). "조회 규칙의 효과는 파생 된 멤버가 동일한 이름이나 서명을 가진 기본 멤버를 숨기는 것입니다. 이러한 단일 상속 조회는 결코 모호하지 않습니다." 나는 aobj.a가 컴파일러에 의해 고려 될 때 aobj가 당분간 무시되고 그냥 고려된다고 생각합니다. – greenonion

+1

컴파일러는 모든 정적 및 인스턴스 멤버를 암시 적 또는 명시 적으로 포함하고 두 멤버를 보는 A 클래스 정의로 이동합니다. 둘 다 (3.5)에 기초하여 접근 할 수 있으므로 그들은 일련의 가능성을 간다. 그런 다음 숨겨진 변수가 정적 변수를 떠나 제거됩니다. 마지막으로 'aobj'가 고려되며 인스턴스 참조가 정적 변수에 액세스 할 수 없기 때문에 오류가 발생합니다. 내 이야기에 문제가있을 수 있습니다. 그렇다면 추측을하기 때문에 저를 바로 잡으십시오. – greenonion

관련 문제