2013-06-12 7 views
6

निम्नलिखित VB.NET कोड काम करता है:क्यों मेरी कोड करता VB.NET में संकलन लेकिन सी # में बराबर विफल रहता है

Dim request As Model.LearnerLogbookReportRequest = New Model.LearnerLogbookReportRequest 
request.LearnerIdentityID = Convert.ToInt32(Session("identityID")) 
request.EntryVersion = LearnerLogbookEntryVersion.Full 

Dim reportRequestService As IReportRequestService = ServiceFactory.GetReportRequestService(ServiceInvoker.LearnerLogbook) 
     reportRequestservice.SaveRequest(request) 

निम्नलिखित सी # कोड को संकलित करने में विफल रहता है:

LearnerLogbookReportRequest request = new LearnerLogbookReportRequest(); 
request.LearnerIdentityID = theLearner.ID; 
request.EntryVersion = LearnerLogbookEntryVersion.Full; 

IReportRequestService reportRequestService = ServiceFactory.GetReportRequestService(ServiceInvoker.LearnerLogbook); 

reportRequestService.SaveRequest(ref request); 

LearnerLogbookReportRequest

Public Class LearnerLogbookReportRequest 
    Inherits AbstractReportRequest 

त्रुटि::

के रूप में घोषित किया जाता है
Error 11 Argument 1: cannot convert from 'ref RACQ.ReportService.Common.Model.LearnerLogbookReportRequest' to 'ref RACQ.ReportService.Common.Model.AbstractReportRequest' C:\p4projects\WEB_DEVELOPMENT\SECURE_ASPX\main-dev-codelines\LogbookSolution-DR6535\RACQ.Logbook.Web\Restful\SendLogbook.cs 64 50 RACQ.Logbook.Web 

सी # संस्करण संकलन करने में विफल क्यों है?

उत्तर

12

वीबी सी # है की तुलना में ByRef पैरामीटर के साथ बल्कि कम है। उदाहरण के लिए, यह आपको संदर्भ द्वारा गुणों को पारित करने की अनुमति देता है। सी # यह अनुमति नहीं देता है।

इसी तरह, Option Strict के साथ, वीबी आपको एक तर्क का उपयोग करने की अनुमति देता है जो घोषित पैरामीटर का उप प्रकार है। एक छोटा लेकिन पूरा कार्यक्रम के रूप में, इस पर विचार करें:

Imports System 

Public Class Test 
    Public Shared Sub Main(args As String()) 
     Dim p As String = "Original" 
     Foo(p) 
     Console.WriteLine(p) 
    End Sub 

    Public Shared Sub Foo(ByRef p As Object) 
     p = "Changed" 
    End Sub 
End Class 

कि वीबी में काम करता है, लेकिन सी # में बराबर नहीं होगा ... और अच्छे कारण के लिए। यह खतरनाक है। इस मामले में, हम एक स्ट्रिंग चर का उपयोग कर रहे हैं और हम p बदलने के लिए एक और स्ट्रिंग का उल्लेख होता है, लेकिन अगर हम करने के लिए Foo के शरीर बदलने के लिए:

p = new Object() 

फिर हम निष्पादन समय पर एक अपवाद प्राप्त करें:

Unhandled Exception: System.InvalidCastException: Conversion from type 'Object' to type 'String' is not valid.

मूल रूप से ref है संकलन-समय प्रकार- सुरक्षित सी # में है, लेकिन ByRef टाइप-सुरक्षित नहीं है VB में विकल्प सख्त बंद के साथ।

जोड़ते हैं:

Option Strict On 

VB में कार्यक्रम के लिए, तथापि (या बस अपनी परियोजना के लिए चूक बदल) आप VB में एक ही समस्या देखना चाहिए:

error BC32029: Option Strict On disallows narrowing from type 'Object' to type 
'String' in copying the value of 'ByRef' parameter 'p' back to the matching 
argument. 

     Foo(p) 
      ~ 

यह पता चलता है कि आप वर्तमान में विकल्प सख्त के बिना कोडिंग कर रहे हैं ... मैं इसे ASAP का उपयोग करने की अनुशंसा करता हूं।

+0

+1 - मैंने मेटा पर सुझाव दिया कि VB.NET टैग के नए पोस्टर को उनके विकल्प सख्त सेटिंग की जांच करने के लिए सुझाव दिया गया है http://meta.stackexchange.com/questions/144007/inform-new-posters-tagging-vb -नेट-टू-चेक-विकल्प-सख्त सेटिंग लेकिन इसे वोट दिया गया था। मैंने टैग विकी को एक नोट जोड़ा, हालांकि इसके लायक क्या है। यह सेटिंग वास्तव में डिफ़ॉल्ट रूप से चालू होनी चाहिए। –

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