2017-01-23 8 views
7

मूल्य स्टूडियो पर is का उपयोग करते समय दृश्य स्टूडियो इस बारे में चेतावनी क्यों देती है, लेकिन जब संदर्भ प्रकारों पर नहीं होती है? रेखाएं 1 और 2 चेतावनी उठाती हैं, जबकि पंक्तियां 3 और 4 नहीं होती हैं।दी गई अभिव्यक्ति हमेशा प्रदान की गई प्रकार

if (5 is object) 
if (new Point() is object) 

if ("12345" is object) 
if (new StringBuilder() is object) 

उत्तर

4

क्योंकि यह माइक्रोसॉफ्ट द्वारा लागू नहीं किया गया था। लेकिन यह उदाहरण है JetBrains ReSharper द्वारा कार्यान्वित किया गया।

Visual Studio

ReSharper 4 चेतावनी दिखाता है::

ReSharper

+0

हालांकि यह विजुअल स्टूडियो के भीतर बहुत अच्छा है, लेकिन जब 'त्रुटियों के रूप में चेतावनियों का इलाज' किया जाता है तो यह निर्माण को तोड़ता नहीं है। इसे देखें: http://stackoverflow.com/q/3361495/2557263 – Alejandro

-1

is ऑपरेटर अतिभारित नहीं किया जा सकता

दृश्य स्टूडियो 2 संकलक चेतावनी को दर्शाता है।

ध्यान दें कि is ऑपरेटर केवल संदर्भ रूपांतरण, मुक्केबाजी रूपांतरण और अनबॉक्सिंग रूपांतरणों को मानता है। अन्य रूपांतरण, जैसे उपयोगकर्ता परिभाषित रूपांतरण, पर विचार नहीं किया जाता है।

स्रोत: MSDN

+0

उद्धरण सामग्री का उपयोग करें> उद्धृत सामग्री –

8

यह एक अनुमानी है और heuristics परिभाषा से, कर रहे हैं, अधूरा।

इस हेरिस्टिक के लिए स्रोत कोड यहां पाया जा सकता है: Roslyn Source: Binder.GetIsOperatorConstantResult

// The result of "x is T" can be statically determined to be true if x is an expression 
// of non-nullable value type T. If x is of reference or nullable value type then 
// we cannot know, because again, the expression value could be null or it could be good. 

जाहिर है, अनुमानी अगर यह जाना जाता है (अपने उदाहरण के रूप में) है कि x एक गैर-शून्य अभिव्यक्ति है सुधार किया जा सकता: कोड निम्नलिखित उद्धरण शामिल हैं। हालांकि, Eric Lippert writes in his blog के रूप में, प्रत्येक चेतावनी (वास्तव में - प्रत्येक कंपाइलर सुविधा) की लागत होती है, और जाहिर है, रोस्लीन डेवलपर्स ने इस रिलीज के लिए इस सुविधा को काफी महत्वपूर्ण नहीं माना।

Thomas Weller's answer दिखाता है, इस अंतर को भरने वाले तीसरे पक्ष के समाधान हैं।

+2

ग्रेट उत्तर के लिए :) –

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