Lỗi Tiện ích mở rộng phản ứng trên Windows Phone


114

Được biên dịch với VS 2012, với loại dự án WP 8.0, mã sau sẽ không thành công nếu trình gỡ lỗi không được đính kèm.

Bằng cách nào đó, nếu trình gỡ lỗi không được đính kèm, các tối ưu hóa của trình biên dịch sẽ làm hỏng mã bên trong Crash()- xem nhận xét trong mã.

Đã thử nghiệm trên Lumia 1520 (8.1)Lumia 630 (8.0) .

Bất kỳ ý tưởng tại sao điều này đang xảy ra?

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's A<T1, T2>

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

6
Có vẻ như lỗi trình biên dịch, không phải lỗi Rx. Bạn đã thử sử dụng ILSpy hoặc .NET Reflector để kiểm tra IL được tạo chưa?
Brandon

8
Tôi sẽ thử sử dụng Observable.Return<T2>(_t2);, thay vì để trình biên dịch quyết định loại ở đây. Có thể có một lỗi với điều đó. Đúng là một cú sút xa.
cwharris

6
Tôi đã gặp rất nhiều vấn đề với Rx trên Windows Phone. Đối với tôi, nó sẽ biên dịch, sau đó ném một MethodNotFoundExceptionkhi tôi thực sự cố gắng gọi lớp chứa. Đối với tôi, nâng cấp lên phiên bản phát hành của VS Update 2 đã hoạt động. Tôi vẫn không biết điều gì đã thực sự xảy ra, nhưng hãy đảm bảo rằng bạn đang sử dụng các bản cập nhật mới nhất về mọi thứ. Rõ ràng là các vấn đề của chúng tôi hơi khác một chút, nhưng điều đó có thể giúp cho bạn một số hướng dẫn.
Matthew Haugen

5
Câu hỏi là gì - 'bất kỳ ý tưởng nào?' - bạn chỉ muốn biết cách làm thế nào để nó không bị rơi?
Tim Lovell-Smith

1
có thể là do _t1.Foo <thiếu kiểu ở đây> (và ở đây nữa);
akbar ali

Câu trả lời:


1
 _t1.Foo<type>(type);

Bạn đang thiếu phần khai báo kiểu. Trình biên dịch đang đoán (và đoán sai). Nhập đúng mọi thứ và nó sẽ chạy.


Đây không phải là một manh mối, bạn có thể tự mình triển khai IObserver và IObservable và mọi thứ sẽ hoạt động tốt.
Yuriy Naydenov

Có vẻ như trình gỡ lỗi đang tạo kết nối với trình biên dịch và trình gỡ lỗi cũng cần tất cả các vars được nhập đúng. Trình gỡ lỗi đang đoán đúng và trình biên dịch bằng cách nào đó đang lấy câu hỏi từ nó. Không thực sự quan trọng tại sao trình gỡ lỗi lại khắc phục được sự cố, nguyên nhân gốc rễ đã được tìm thấy.
Nhật Bản
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.