Подтвердить что ты не робот

Ошибка реактивных расширений на Windows Phone

Скомпилированный с VS 2012, с типом проекта WP 8.0 следующий код не будет работать, если отладчик не подключен.

Как бы то ни было, если отладчик не подключен, оптимизация компилятора разрушает код внутри Crash() - см. комментарии в коде.

Протестировано на Lumia 1520 (8.1) и Lumia 630 (8.0).

Любые идеи, почему это происходит?

public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();
        Button.Tap += (sender, args) => new A<B, string>(new B(), "string").Crash();
    }
}
public class B
{
    public void Foo<T>(T val) { }
}
public class A<T1, T2> where T1 : B
{
    private T1 _t1;
    private T2 _t2;
    public A(T1 t1, T2 t2)
    {
        _t2 = t2;
        _t1 = t1;
    }
    public void Crash()
    {
        var obs = Observable.Return(_t2);
        obs.Subscribe(result =>
        {
            //CLR is expecting T2 to be System.String here,
            //but somehow, after passing through Observable
            //T2 here is not a string, it A<T1, T2>

            new List<T2>().Add(result);
        });
        //Will run normally if commented
        _t1.Foo(new object());
    }
}
4b9b3361

Ответ 1

 _t1.Foo<type>(type);

Вам не хватает объявления типа. Компилятор угадывает (и угадывает неправильно). Строго введите все, и он должен работать.