2014-10-24 10 views
13

निम्नलिखित कोड को देखते हुए, 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); 
} 
+0

मैं ReSharper का उपयोग नहीं करते। लेकिन अगर यह पता चलता है कि 'foo! = Null'' NullReferenceException' को रोकता है, तो यह क्यों नहीं जानता कि 'NotNull' भी नल-फ़ूज़ छोड़ देता है? क्या आप 'NotNull' भी दिखा सकते हैं? –

+1

@Tim उनके पास प्लगइन में निर्मित कुछ नियम हैं, इसलिए यह जानता है कि '.Where (...)' उदाहरण के लिए क्या करता है, और विश्लेषण इंजन तदनुसार कार्य कर सकता है। लेकिन यह उपयोगकर्ता विधियों के अंदर नहीं आता है, क्योंकि सामान्य मामले में इसे हल करना [रोकथाम समस्या] (http://en.wikipedia.org/wiki/Halting_problem) को हल करने के बराबर होगा। अफसोस की बात है, मुझे नहीं लगता कि इस विशेष नियम को एनोटेट करने का एक तरीका है ... '[अनुबंध एन्नोटेशन (" ?? ")]' एक समाधान हो सकता है लेकिन संख्याओं के लिए कोई वाक्यविन्यास नहीं है। –

+0

@TimSchmelter मुझे नहीं पता, लेकिन मुझे संदेह है क्योंकि विश्लेषक यह निर्धारित करने के लिए गहरी विधि निरीक्षण नहीं करता है कि शून्यता को आखिरी बार चेक किया गया था। उदाहरण के लिए, अगर मैं '.Where' साथ nulls को फ़िल्टर, और फिर तुरंत एक' .OrderBy', Resharper ज्ञान है कि nulls रूप से फ़िल्टर कर कम करने के लिए लगता है श्रृंखला - मुझे पता है कि Resharper इस क्षेत्र में अन्य रोचक गलतियाँ करता है। – ean5533

उत्तर

3

आप ItemNotNullAttribute का उपयोग कर सकते हैं जो ReSharper को बताता है कि संग्रह में कोई आइटम कभी भी null हो सकता है।

+0

उत्कृष्ट! ऐसा लगता है कि उन्होंने 2016 में कहा - बहुत खुश। – ean5533

1

एक ही रास्ता के रूप में आप ने कहा उपयोग करने के लिए है [NotNull] विशेषता जो Resharper इंजन हिदायत के लिए अशक्त संदर्भ त्रुटि के लिए जाँच को रोकने के लिए वह विशेष चर।

वरना तुम उस विशेषता का उपयोग करने आप वैकल्पिक रूप से टिप्पणी

// ReSharper disable PossibleNullReferenceException 
     var bars = foos.Select(foo => foo.Bar); 
// ReSharper restore PossibleNullReferenceException 

उपयोग कर सकते हैं इस सवाल का एक बिंदु बनाने के लिए नहीं करना चाहते हैं, Resharper इसलिए यह एक बना सकते हैं बयान के क्रम कम्प्यूटेशनल मूल्यों के माध्यम से पार नहीं कर सकते निर्णय है कि यह शून्य नहीं हो सकता है।

+0

'नोट नूल' विशेषता केवल यह सत्यापित करेगी कि * संख्यात्मक * शून्य नहीं है, यह सत्यापित नहीं करेगा कि गणना के * परिणाम * शून्य नहीं हैं। साथ ही, ऊपर दी गई टिप्पणियों में बताया गया है कि, जब भी मैं एक गणना का उपयोग करता हूं, मैं बार-बार शून्य संदर्भ जांच को अक्षम नहीं करना चाहता हूं। – ean5533

संबंधित मुद्दे