2011-08-30 10 views
7

कोड VB.NET मेंVB.NET वाक्य रचना और स्ट्रिंग एक्सटेंशन के तरीके

Module Utils 
<Runtime.CompilerServices.Extension()> _ 
Public Sub Print(ByVal message As String) 
    Console.WriteLine(message) 
End Sub 
End Module 

Public Class Foo 
Public Sub New() 
    Dim test = "cucu" 
    test.Print() ' no problem: custom string extension method ' 
    "cucu".Print() ' syntax error ' 
End Sub 
End Class 

1) सबसे पहले समस्या नहीं, मैं उपयोग करने के लिए "Cucu" .MyExtensionMethod() के साथ-साथ test.MyExtensionMethod सक्षम होने के लिए पसंद करते हैं();

1 ') सिंटेक्स की तरह

"No Result".Print() ' Print is an extension method ' 
    " No Result ".Trim() ' Trim is a framework method ' 

उन दोनों

हालांकि, वाक्य रचना की तरह

myTextBox.Text = "No Result".Translate() ' Translate is an extension method ' 
    myTextBox.Text = " No Result ".Trim() ' Trim is a framework method ' 

काम करता है बहुत अच्छी तरह से काम नहीं करता।

तो स्ट्रिंग निरंतर व्यवहार की कुछ स्थिरता याद आती है।

2) टिप्पणियाँ (संलग्न चित्र में) पर एक नज़र डालें। शब्द "कस्टम", "स्ट्रिंग" और "त्रुटि" को हाइलाइट किया गया है, हालांकि वे टिप्पणियों में हैं, इसलिए हरा होना चाहिए, नीला नहीं होना चाहिए।

यह क्यों? क्या कामकाज?

संपादित करें:

Microsoft Connect में "बग" के रूप में घोषित ...

संपादित 2 (भले ही अधिक नहीं है कि एक वाक्यात्मक "याद आती है" है):

के रूप में टिप्पणी की हंस Passant, मानक स्ट्रिंग विधियों, जैसे "cucu".Trim() या तो काम नहीं करता है।

+1

उम, वर्कअराउंड इसे एक चर के रूप में असाइन करना है जैसा आपने 'test' के साथ किया था? – BoltClock

+0

@ बोल्टक्लॉक))) ठीक है, यह क्यों?)) – serhio

+1

आप कैसे सुनिश्चित हैं कि यह पहले से ही एक बग है? – BoltClock

उत्तर

8

मैं पुष्टि कर सकता यह वास्तव में एक "बग" (विजुअल स्टूडियो 2008 में परीक्षण किया गया) है कर सकते हैं। लेकिन वास्तव में, यह वीबी में डिजाइन द्वारा है और बदला नहीं जाएगा।

हालांकि, मैं यह समझाने के लिए समय लेना चाहता हूं कि क्यों यह एक भयानक प्रश्न है। क्षमा करें Serhio।

  1. यह समस्या को पुन: उत्पन्न करने के लिए आवश्यक सभी चरणों की सूची नहीं देता है।
  2. यह पूरा कोड प्रदान नहीं करता है।
  3. यह कम से कम करने के लिए समस्या को कम नहीं करता है (यहां Infer उपयोग न करें - यह समस्या की राह में बाधक)
  4. एक परिणाम के रूप में, वहाँ एक सौ अलग अलग कारण है कि पूरी तरह से इस व्यवहार की व्याख्या करता है, बिना कर रहे हैं एक बग (उदाहरण के लिए, stakx 'उत्कृष्ट (अब हटाया गया) उत्तर देखें)।

यहां एक संपूर्ण उदाहरण है, वीबी के लिए डिफ़ॉल्ट सेटिंग का उपयोग, कि इन समस्याओं (एक नई खाली कंसोल प्रोजेक्ट समाधान बना सकते हैं और Module1.vb में इस कोड को) नहीं है:

Module Extensions 
    <System.Runtime.CompilerServices.Extension()> _ 
    Public Sub ShowDialog(ByVal message As String) 
     Console.WriteLine(message) 
    End Sub 
End Module 

Module Module1 
    Sub Main() 
     Dim s As String = "Hello" 
     s.ShowDialog() 
     ' Doesn’t work: 
     '"World".ShowDialog() 
     ' Works: 
     Call "World".ShowDialog() 
    End Sub 
End Module 

व्यवहार वीबी में संगत है: आपके पास तार्किक रेखा में पहला टोकन के रूप में कोई मान नहीं हो सकता है।उदाहरण के लिए, निम्न कोड भी संकलन नहीं करता है (एक मौजूदा, उचित, एक रूप वर्ग Form1 की परिभाषा दी):

New Form1().ShowDialog() 

और एक बार फिर से ठीक कर Call द्वारा अभिव्यक्ति उपसर्ग के लिए है:

Call New Form1().ShowDialog() 
+0

आपकी कुछ टिप्पणियों को ठीक करता है)। .. मुझे पता है कि यह शायद एक असली सवाल नहीं है। मैं बस इस "समस्या" को साझा करना चाहता हूं। – serhio

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