विंडोज फोन पर रिएक्टिव एक्सटेंशन्स बग


114

यदि डिबगर संलग्न नहीं है, तो VS 2012प्रोजेक्ट प्रकार WP 8.0के साथ संकलित निम्न कोड विफल हो जाएगा।

किसी तरह, यदि डिबगर संलग्न नहीं है, तो कंपाइलर ऑप्टिमाइज़ेशन कोड को अंदर ही बर्बाद कर देते हैं Crash()- कोड में टिप्पणियां देखें।

लूमिया 1520 (8.1) और लूमिया 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 बग नहीं। क्या आपने उत्पन्न IL की जांच करने के लिए ILSpy या .NET रिफ्लेक्टर का उपयोग करने की कोशिश की है?
ब्रैंडन

8
मैं Observable.Return<T2>(_t2);यहाँ टाइप तय करने के लिए इसे संकलक तक छोड़ने के बजाय उपयोग करने की कोशिश करूँगा । इसके साथ एक बग हो सकता है। दी, यह एक लंबा शॉट है।
1

6
मुझे विंडोज फोन पर आरएक्स के साथ समस्याओं का एक टन था। मेरे लिए, यह संकलित करेगा, तब फेंक देगा MethodNotFoundExceptionजब मैंने वास्तव में युक्त वर्ग को कॉल करने का प्रयास किया था। मेरे लिए, वीएस अपडेट 2 के रिलीज़ संस्करण में अपग्रेड किया गया। मुझे अभी भी पता नहीं है कि वास्तव में क्या गलत था, लेकिन सुनिश्चित करें कि आप हर चीज पर नवीनतम अपडेट का उपयोग कर रहे हैं। जाहिर है कि हमारी समस्याएं थोड़ी अलग हैं, लेकिन इससे कुछ मार्गदर्शन मिल सकता है।
मैथ्यू हॉजेन

5
प्रश्न क्या है - 'कोई विचार?' - क्या आप जानना चाहते हैं कि दुर्घटना को रोकने के लिए इसे कैसे प्राप्त करें?
टिम लोवेल-स्मिथ

1
हो सकता है क्योंकि _t1.Foo <लापता प्रकार यहाँ> (और यहाँ भी);
अकबर अली

जवाबों:


1
 _t1.Foo<type>(type);

आपको प्रकार की घोषणा याद आ रही है। संकलक अनुमान लगा रहा है (और गलत अनुमान लगा रहा है)। कड़ाई से सब कुछ टाइप करें और इसे चलना चाहिए।


यह एक सुराग नहीं है, आप अपने आप से IObserver और IObservable को लागू कर सकते हैं और सब कुछ ठीक काम करेगा।
यूरी नयदेनोव

ऐसा लगता है कि डीबगर कंपाइलर से संबंध बना रहा है, और डीबगर को सभी प्रकारों को कड़ाई से टाइप करने की आवश्यकता है। डीबगर सही अनुमान लगा रहा है, और कंपाइलर किसी तरह इससे क्वेस ले रहा है। यह वास्तव में मायने नहीं रखता है कि डिबगर समस्या को ठीक क्यों करता है, मूल कारण पाया गया है।
जपेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.