Breaking change in С# 4.0
От: nikov США http://www.linkedin.com/in/nikov
Дата: 20.03.10 15:49
Оценка: 30 (4)
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);
    }
}


C# 3.0: 1
C# 4.0: 2
Re: Breaking change in С# 4.0
От: Lloyd Россия  
Дата: 20.03.10 17:26
Оценка:
Здравствуйте, nikov, Вы писали:

N>
N>using System;

N>class C
N>{
N>    static event Action E;
N>    static void Foo(Func<object> y) { Console.WriteLine(1); }
N>    static void Foo(Action y) { Console.WriteLine(2); }

N>    static void Main()
N>    {
N>        Foo(() => E += Console.WriteLine);
N>    }
N>}
N>


N>C# 3.0: 1

N>C# 4.0: 2

А почему в 3.0 такой странный результат? Это бага или есть какое-то разумное объяснение?
Re[2]: Breaking change in С# 4.0
От: Пельмешко Россия blog
Дата: 20.03.10 17:33
Оценка: 64 (4)
Здравствуйте, Lloyd, Вы писали:

L>А почему в 3.0 такой странный результат? Это бага или есть какое-то разумное объяснение?


В 3.0 при обращении к field-like event из обладающего им класса на самом деле обращение идёт к полю-делегату.
Если применить оператор += к делегату, то результатом будет делегат.

В 4.0 при применении +=/-= к field-like event теперь дёргаются акцессоры события, а они возвращают void.
Re[2]: Breaking change in С# 4.0
От: Пельмешко Россия blog
Дата: 20.03.10 17:38
Оценка: 52 (5)
Здравствуйте, Lloyd, Вы писали:

L>А почему в 3.0 такой странный результат? Это бага или есть какое-то разумное объяснение?


Так что это в 4.0 результат можно назвать странным, ибо оператор += ничего не возвращает
Всё это — следствия lock-free event subscription, подробнее по теме советую почитать:

Chris Burrows' Blog: Events get a little overhaul in C# 4
Part I: Locks
Part II: Semantic Changes and +=/-=
Part III: Breaking Changes
Re[3]: Breaking change in С# 4.0
От: vdimas Россия  
Дата: 21.03.10 12:14
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>В 4.0 при применении +=/-= к field-like event теперь дёргаются акцессоры события, а они возвращают void.


Супер, а то предыдущее решение смотрелось как простор для граблей.
Re[4]: Breaking change in С# 4.0
От: Пельмешко Россия blog
Дата: 21.03.10 12:29
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Пельмешко, Вы писали:


П>>В 4.0 при применении +=/-= к field-like event теперь дёргаются акцессоры события, а они возвращают void.


V>Супер, а то предыдущее решение смотрелось как простор для граблей.


Ага, получается просто скомпилировав под 4.0 можно избавиться от threading issues, о которых никогда и не подозревал, да ещё и небольшой выигрыш в производительности подписки получить Сомневаюсь, что в продакшене вообще найдётся код, который поломается из-за того, что compound assignment для field-like event теперь ничего не будет возвращать
Re[3]: Breaking change in С# 4.0
От: nikov США http://www.linkedin.com/in/nikov
Дата: 21.03.10 13:25
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>В 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);
    }
}
Re[4]: Breaking change in С# 4.0
От: vdimas Россия  
Дата: 21.03.10 14:25
Оценка: +1
Здравствуйте, nikov, Вы писали:

N>Верное объяснение! Теперь маленькая загадка. Что напечатает такой код в C# 4.0?


Если скомпилируется, то
2
1
?

(E) — вроде выражение, если такое допустимо по отношению к идентификатору события.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.