2013-06-12 1 views
6

실패 :은 VB.NET 컴파일하지만, C#에서 동등한 다음 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) 

다음 C# 코드는 컴파일에 실패 :

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 

왜 C# 버전이 컴파일되지 않습니까?

답변

12

VB는 ByRef 매개 변수가 C#보다 다소 느슨합니다. 예를 들어, 참조로 속성을 전달할 수 있습니다. C#은 이것을 허용하지 않습니다.

마찬가지로 Option Strict을 사용하면 VB에서 선언 된 매개 변수의 하위 형식 인 인수를 사용할 수 있습니다. 짧지 만 완전한 프로그램으로,이 사항을 고려하십시오

VB에서 작동하지만 C#에서 동등한는 않을 것 ... 그리고 좋은 이유
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는 컴파일시의 형태 안전한 C#에서,하지만 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) 
      ~ 

이이 제안을 Option Strict를 사용하지 않고 현재 코딩 중입니다 ... 가능한 빨리 사용하는 것이 좋습니다.

+0

+1 - VB.NET 태그에 대한 새로운 포스터가 옵션 엄격 설정을 확인하도록 제안되었습니다. http://meta.stackexchange.com/questions/144007/inform-new-posters-tagging-vb -net-to-check-option-strict-setting하지만 투표에서 제외되었습니다. 그러나 Tag Wiki에 어떤 가치가 있는지에 대한 메모를 추가했습니다. 이 설정은 기본적으로 켜져 있어야합니다. –