निम्नलिखित कोड को देखते हुए, Resharper सही ढंग से मुझे एक संभव NullReferenceException
के बारे में foo.Bar
पर चेतावनी देगा क्योंकि वहाँ हो सकता है गणनीय में अशक्त तत्वों: स्थिर विश्लेषक को पूरा करने केमैं रिशेर्पर को कैसे बता सकता हूं कि मेरी आईनेमरेबल विधि नल को हटा देती है?
IEnumerable<Foo> foos = GetFoos();
var bars = foos.Select(foo => foo.Bar);
एक तरह से स्पष्ट रूप से nulls बाहर करने के लिए है:
IEnumerable<Foo> foos = GetFoos().Where(foo => foo != null);
मैं अपने आप को .Where(x => x != null)
एक बहुत टाइपिंग, तो मैं यह एक विस्तार विधि में लिपटे मिल जाए, और अब मैं निम्न कर सकते हैं:
IEnumerable<Foo> foos = GetFoos().NotNull();
समस्या Resharper नहीं जानता है कि NotNull()
बाहर स्ट्रिप्स कि nulls है। क्या इस तरह के बारे में मैं रिशेर्पर को पढ़ सकता हूं? सामान्य तौर पर, वहाँ Resharper बताने के लिए एक तरीका है कि एक IEnumerable
-returning विधि यह में nulls है कभी नहीं होगा (ताकि मैं सिर्फ सीधे GetFoos()
टिप्पणी कर सकते हैं) क्या है?
मैं जानता हूँ कि मैं the NotNullAttribute
उपयोग कर सकते हैं Resharper कि गणनीय ही रिक्त नहीं है बताने के लिए है, लेकिन मैं एक है कि सामग्री गणनीय की के बारे में बोलते नहीं मिल रहा।
संपादित करें: विस्तार विधि वास्तव में लग रहा है के रूप में आप उम्मीद थी:
[NotNull]
public static IEnumerable<T> NotNull<T>(this IEnumerable<T> enumerable)
{
return enumerable.Where(x => x != null);
}
मैं ReSharper का उपयोग नहीं करते। लेकिन अगर यह पता चलता है कि 'foo! = Null'' NullReferenceException' को रोकता है, तो यह क्यों नहीं जानता कि 'NotNull' भी नल-फ़ूज़ छोड़ देता है? क्या आप 'NotNull' भी दिखा सकते हैं? –
@Tim उनके पास प्लगइन में निर्मित कुछ नियम हैं, इसलिए यह जानता है कि '.Where (...)' उदाहरण के लिए क्या करता है, और विश्लेषण इंजन तदनुसार कार्य कर सकता है। लेकिन यह उपयोगकर्ता विधियों के अंदर नहीं आता है, क्योंकि सामान्य मामले में इसे हल करना [रोकथाम समस्या] (http://en.wikipedia.org/wiki/Halting_problem) को हल करने के बराबर होगा। अफसोस की बात है, मुझे नहीं लगता कि इस विशेष नियम को एनोटेट करने का एक तरीका है ... '[अनुबंध एन्नोटेशन (" ?? ")]' एक समाधान हो सकता है लेकिन संख्याओं के लिए कोई वाक्यविन्यास नहीं है। –
@TimSchmelter मुझे नहीं पता, लेकिन मुझे संदेह है क्योंकि विश्लेषक यह निर्धारित करने के लिए गहरी विधि निरीक्षण नहीं करता है कि शून्यता को आखिरी बार चेक किया गया था। उदाहरण के लिए, अगर मैं '.Where' साथ nulls को फ़िल्टर, और फिर तुरंत एक' .OrderBy', Resharper ज्ञान है कि nulls रूप से फ़िल्टर कर कम करने के लिए लगता है श्रृंखला - मुझे पता है कि Resharper इस क्षेत्र में अन्य रोचक गलतियाँ करता है। – ean5533