Имеется такой код
public class A
{
}
public class C : A
{
public event EventHandler Modified;
}
public class F<T>
where T : A
{
private readonly T owner;
public F(T owner)
{
this.owner = owner;
}
public T Owner { get { return owner; } }
}
public class G : F<C>
{
public G(C owner)
: base(owner)
{
Owner.Modified += (o, e) => A();
}
private static void A()
{
}
}
class Program
{
static void Main(string[] args)
{
C c = new C();
G g = new G(c);
}
}
Компилятор выдает вот такой вот warning
warning CS0067: The event 'TestConsole.C.Modified' is never used
Здравствуйте, Uzzy, Вы писали:
U>Имеется такой код
U> public class C : A
U> {
U> public event EventHandler Modified;
U> }
U>Компилятор выдает вот такой вот warning
U>warning CS0067: The event 'TestConsole.C.Modified' is never used
U>
Объявлен field-like event. В месте подписки вызываются методы add_Modified и remove_Modified. Само же поле делегата для события нигде не используется (а оно использовалось бы если б в классе C событие где-нибудь возбуждалось бы). Скорее всего это некая эвристика, что "наверняка" (с точки зрения компилятора) такой код програмист написал по ошибке, объявив событие и забыв его отправить.
Почему нет такого же ворнинга если событие не field-like? Видимо, потому что компилятору невозможно определить способ отправки не-field-like события.
Потому что в приведенном коде оно не пробрасывается. И нет возможности его пробросить, например:
static void Main(string[] args)
{
C c = new C();
G g = new G(c);
c.Modified(new object(), new EventArgs());
}
приводит к ошибке.
В то время, как добавление метода:
public class C : A
{
public event EventHandler Modified;
public void click()
{
Modified(new object(), new EventArgs());
}
}
...
...
...
static void Main(string[] args)
{
C c = new C();
c.click();
}
Исправляет ситуацию.