Здравствуйте, Lloyd, Вы писали:
L>А почему в 3.0 такой странный результат? Это бага или есть какое-то разумное объяснение?
Так что это в 4.0 результат можно назвать странным, ибо оператор += ничего не возвращает
Всё это — следствия lock-free event subscription, подробнее по теме советую почитать:
Здравствуйте, Lloyd, Вы писали:
L>А почему в 3.0 такой странный результат? Это бага или есть какое-то разумное объяснение?
В 3.0 при обращении к field-like event из обладающего им класса на самом деле обращение идёт к полю-делегату.
Если применить оператор += к делегату, то результатом будет делегат.
В 4.0 при применении +=/-= к field-like event теперь дёргаются акцессоры события, а они возвращают void.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Пельмешко, Вы писали:
П>>В 4.0 при применении +=/-= к field-like event теперь дёргаются акцессоры события, а они возвращают void.
V>Супер, а то предыдущее решение смотрелось как простор для граблей.
Ага, получается просто скомпилировав под 4.0 можно избавиться от threading issues, о которых никогда и не подозревал, да ещё и небольшой выигрыш в производительности подписки получить Сомневаюсь, что в продакшене вообще найдётся код, который поломается из-за того, что compound assignment для field-like event теперь ничего не будет возвращать
Здравствуйте, Пельмешко, Вы писали:
П>В 3.0 при обращении к field-like event из обладающего им класса на самом деле обращение идёт к полю-делегату. П>Если применить оператор += к делегату, то результатом будет делегат.
П>В 4.0 при применении +=/-= к field-like event теперь дёргаются акцессоры события, а они возвращают void.
Верное объяснение! Теперь маленькая загадка. Что напечатает такой код в C# 4.0?
using System;
class C
{
static event Action E;
static void Foo(Func<object> y) { Console.WriteLine(1); }
static void Foo(Action y) { Console.WriteLine(2); }
static void Main()
{
Foo(() => E += Console.WriteLine);
Foo(() => (E) += Console.WriteLine);
}
}