Использование:
я есть эта программа:
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 класса - один и два, два потомка одного. В классе One (SomethingChanged) объявлено событие, которое инициируется классом One и классом Two. Но взгляните на 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')
Так что мне просто любопытно, почему я не могу использовать «сырой» код в классе Два, чтобы вызвать событие, но когда я вызываю соответствующую функцию, возникает событие?
[Редактировать] нашел некоторые разъяснения здесь:C #: Возбуждение унаследованного события