2015-05-27 5 views
9

मैंने वीबीएनईटी में C# के default कीवर्ड समकक्ष की खोज की और this question पर आया।वीबी न्यूलबल्स और नोथिंग्स

तब मुझे उत्सुकता मिली। कुछ पृष्ठभूमि - मैं एक्सेल स्प्रैडशीट को पार्स करने के साथ काम कर रहा हूं, जहां कई कॉलम शून्य हो सकते हैं, और मेरे लिए एक पूर्णांक कॉलम 0 और null होने के बीच निश्चित रूप से एक अंतर है।

Function Test(ByVal i As String) As Nullable(Of Integer) 
    Dim j As Integer 

    If Integer.TryParse(i, j) Then 
     Return j 
    Else 
     Return Nothing 
    End If 
End Function 

इस सही ढंग से काम करने लगता है:

मैं एक छोटे से पार्स विधि लिखा था। लेकिन यहाँ, मैं एक Integer लौट सकते हैं अगर मैं चाहता हूँ:

Function Test(ByVal i As String) As Nullable(Of Integer) 
    Return 2 'or Return Nothing 
End Function 

जो मैं C# में कर सकते हैं और साथ ही:

static void Main(string[] args) 
{ 
    int? j = Test("1"); 
} 

public static int? Test(string i) 
{ 
    return 2; //or return null 
} 

उपरोक्त कोड में, अगर मैं एक int को j बदलने के लिए, मैं हूँ एक संकलन-समय रूपांतरण त्रुटि प्राप्त करें, जो कुल समझ में आता है।

अब मेरे सवाल - VB में, अगर मैं एक समान दृष्टिकोण का प्रयास:

Sub Main() 
    Dim j As Integer = Test("hello") 
End Sub 

Function Test(ByVal i As String) As Nullable(Of Integer) 
    Dim j As Integer 
    Return If(Integer.TryParse(i, j), j, Nothing) 
End Function 

या, अपने परीक्षण मामले में जहां i एक Integer यह के रूप में लिखा जा सकता है में:

Function Test(ByVal i As String) As Nullable(Of Integer) 
    Return DirectCast(Nothing, Integer) 
End Function 

Nothing VB.NET में काम करता है, इस कोड को संकलित और बिना त्रुटि के चलाता है - जे इंटीजर के डिफ़ॉल्ट 0 पर सेट है।

यह मेरे लिए इतना गंदा लगता है। इस परिदृश्य में आप किसी भी चेतावनी या त्रुटियों के बिना विधि के इरादे को कुछ हद तक बदल सकते हैं। मैं बस उत्सुक हूं, मान लीजिए, क्या यह Nothing वीबी में काम करता है, या यह उद्देश्य उद्देश्य का एक अनजान उप-उत्पाद है?

+0

हाँ, '0' vb में करने के लिए इंट के डिफ़ॉल्ट ... – Codexer

उत्तर

4

आपका वीबी.Net कोड संकलित करता है क्योंकि आप देर से बाध्यकारी का उपयोग कर रहे हैं, जो रनटाइम पर एक चर के प्रकार को बदलने की अनुमति देता है।

आप OPTION STRICT ON के साथ अपने कोड संकलन हैं, तो आप एक संकलक त्रुटि मिलेगी की तरह:

विकल्प सख्त पर से अंतर्निहित रूपांतरण की अनुमति नहीं देता 'पूर्णांक?' 'इंटीजर' करने के लिए।

+0

धन्यवाद । सरल स्पष्टीकरण, लेकिन यह समझ में आता है। अधिक कारणों से मैं वास्तव में वीबी का आनंद क्यों नहीं लेता हूं। – Jonesopolis

2

आप NULL को VB.Net में किसी मान प्रकार में असाइन नहीं कर सकते हैं जिसमें यह उस प्रकार को उसके डिफ़ॉल्ट मान के साथ तत्काल करता है। आपके मामले में आप एक NULL पूर्णांक नहीं बना रहे हैं, लेकिन एक पूर्णांक है कि 0.

एक और अच्छा टिप्पणी का डिफ़ॉल्ट मान रखती है: बारी Option Strict On

+0

आपकी पहली वाक्य आपके दूसरे एक के विपरीत है। निश्चित रूप से आप उस प्रकार के डिफ़ॉल्ट मान प्राप्त करने के लिए किसी मान प्रकार के चर के लिए 'कुछ भी नहीं' असाइन कर सकते हैं। आप इसे अपने दूसरे वाक्य में भी कहते हैं। – sloth

+0

सुधार के लिए धन्यवाद, यह नहीं देखा! – Codexer