Windows Phoneのリアクティブ拡張機能のバグ


114

でコンパイルされ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's A<T1, T2>

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

6
Rxのバグではなく、コンパイラのバグのようです。ILSpyまたは.NET Reflectorを使用して、生成されたILを調べましたか?
ブランドン

8
Observable.Return<T2>(_t2);ここでタイプを決定するためにコンパイラーに任せるのではなく、を使用してみます。バグがあるかもしれません。確かに、それはロングショットです。
cwharris 14

6
Windows PhoneのRxで多くの問題が発生しました。私にとっては、コンパイルしてから、MethodNotFoundException実際に包含クラスを呼び出そうとしたときにをスローします。私にとって、VS Update 2のリリースバージョンへのアップグレードはうまくいきました。実際に何が問題だったかはまだわかりませんが、すべての最新アップデートを使用していることを確認してください。明らかに私たちの問題は少し異なりますが、それはいくつかのガイダンスを貸すのに役立つかもしれません。
マシューハウゲン14

5
質問は何ですか-「アイデア」?-クラッシュを停止する方法を知りたいだけですか?
Tim Lovell-Smith、

1
_t1.Foo <ここに型がありません>(そしてここにも));
akbar ali 2015

回答:


1
 _t1.Foo<type>(type);

型宣言がありません。コンパイラが推測している(推測が間違っている)。すべてを厳密に入力すると、実行されます。


これは手がかりではありません。IObserverとIObservableを自分で実装でき、すべてが正常に動作します。
Yuriy Naydenov 2015年

デバッガーがコンパイラーへの接続を作成しているようで、デバッガーもすべての変数を厳密に型指定する必要があります。デバッガーは正しい推測をしており、コンパイラーはなんとかしてそこからクエリを取得しています。デバッガーが問題を修正する理由は本当に重要ではなく、根本的な原因が見つかりました。
Japes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.