2013-06-12 13 views
6

başarısız:VB.NET içinde derlemek ancak C# eşdeğer aşağıdaki VB.NET kodu çalışır

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) 

aşağıdaki C# kodu derlemek için başarısız:

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 

Hata:

olarak ilan edilir
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# sürümü neden derlenemiyor?

cevap

12

VB, C# 'dan ByRef parametreleriyle daha gevşek. Örneğin, özellikleri referans ile geçirmenizi sağlar. C# buna izin vermiyor.

Benzer şekilde, Option Strict kapalı olarak, VB bildirilen parametrenin bir alt türü olan bir argüman kullanmanıza izin verir. kısa ama tam bir program gibi, bu göz önünde bulundurun:

VB çalışır, ancak C# eşdeğer olmaz ... ve iyi bir nedenle
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 

. Tehlikeli. Bu durumda, bir dize değişkeni kullanıyor ve biz başka dize başvurmak için p değiştirmek olur, ama biz Foo gövdesini değiştirirseniz:

p = new Object() 

Sonra yürütme zamanında bir özel olsun:

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

Temelde ref olduğunu derleme zamanı tür-güvenli C#, ancak ByRef tip-güvenli değildir VB Seçeneği kapalı Sıkı ile.

Eğer eklerseniz:

Option Strict On 

VB programa Ancak (ya da sadece proje için varsayılan değiştirme) Eğer VB aynı sorunu görmelisiniz:

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) 
      ~ 

Bu anlaşılacağı Şu anda Option Strict olmadan kodladığınız ... ASAP kullanmanız önerilir.

+0

+1 - Meta üzerinde, VB.NET etiketine yeni posterlerin Seçenek Strict Ayarlarını kontrol etmek için önerildiğini önerdim: http://meta.stackexchange.com/questions/144007/inform-new-posters-tagging-vb -net-to-check-option-strict-setting ancak oy verildi. Tag Wiki'ye ne kadar değer kattığına dair bir not ekledim. Bu ayar gerçekten varsayılan olarak açık olmalıdır. –