Đượ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) và 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
Tôi sẽ thử sử dụng
—
cwharris
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.
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
—
Matthew Haugen
MethodNotFoundException
khi 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.
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
có thể là do _t1.Foo <thiếu kiểu ở đây> (và ở đây nữa);
—
akbar ali