2011-04-13 3 views
4

나는이 프로그램이 있습니다C# 이벤트 상속

class One 
    { 
     public delegate void del(object o); 
     public event del SomethingChanged; 

     int x; 
     public int X 
     { 
      get { return x; } 
      set { x = value; OnSomethingChanged(this); } 
     } 

     protected void OnSomethingChanged(object o) 
     { 
      if (SomethingChanged != null) 
       SomethingChanged(o); 
     } 
    } 

    class Two: One 
    { 
     public void ChangeSomething() 
     { 
      //if (SomethingChanged != null) 
      // SomethingChanged(this); 
      OnSomethingChanged(this); 
     } 
    } 

    static void Main(string[] args) 
    { 
     One one = new One(); 
     Console.WriteLine(one.X); 
     one.SomethingChanged += new One.del(one_SomethingChanged); 
     one.X = 5; 
    } 

    static void one_SomethingChanged(object o) 
    { 
     Console.WriteLine(((One)o).X); 
    } 

2 종류가 있습니다 - 하나, 둘, 두 하나의 자손이다. 클래스 1 (SomethingChanged)에 선언 된 이벤트가 있으며 클래스 1과 클래스 2에 의해 트리거됩니다. Two.ChangeSomething - 기본 클래스의 메서드를 호출하여 이벤트를 발생시킵니다. 나는

 
if (SomethingChanged != null) 
    SomethingChanged(this); 

내가

 
The event 'One.SomethingChanged' can only appear on the left hand side of += or -= (except when used from within the type 'eventstest.Program.One') 

그래서 내가 수업 시간에 '원시'코드를 사용할 수없는 이유 그냥 궁금 해요 말 컴파일러 오류를 받고 있어요 같은 원시 코드를 사용하여 이벤트를 호출하려고하지만 경우 2 개의 이벤트를 발생 시키지만 해당 함수 이벤트를 호출 할 때 발생합니까?

[편집]

어떤 해명 여기 찾았 C#: Raising an inherited event

답변

1

if (SomethingChanged != null) 
    SomethingChanged(this); 

가 (그런데, 경쟁 조건이있는) SomethingChangedDelegate.GetInvocationList를 호출하는 것을 의미 코드입니다. 자동 구현 된 이벤트는 이벤트가 정의 된 클래스에 있지 않는 한 수행 할 수 없습니다.

이벤트를 수동으로 구현 한 경우 수행 할 수 있으며 protected을 사용하면 위임 된 필드에 대한 액세스 권한을 제공합니다 행사.

0

사용 :

this.SomethingChanged += new One.del(one_SomethingChanged); 
6

당신은, 생성 된 IL 실제로이 개 해당 요소가 포함되어 C 번호에서 "이벤트"키워드를 사용하여 이벤트 선언 할 때 : 개인 대리인 필드와 같은 가시성 이벤트 접근을 선언 된 이벤트. 이벤트 액세서는 이벤트를 시작하는 데 사용할 수 없습니다. 알림을 구독하고 구독을 취소하는 데에만 사용됩니다. SomethingChanged(this) 코드는 비공개 필드를 사용하여 대리인을 호출하며 비공개 필드는 클래스 외부에서 사용할 수 없습니다.

+1

꽤 많이 정확하게 말한 old Jon Skeet 답변에 대한 링크를 게시하려했는데 (http://stackoverflow.com/questions/253757/why-events-cant-be-used-in-the-same -way-in-derived-class-as-the-base-class # 253803) +1 – RobV