2013-06-12 11 views
6

次VB.NETのコードが動作する失敗しない:なぜ私のコードは、VB.NETでコンパイルが、C#で相当

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は、C#よりもむしろByRefパラメータではかなり緩いです。たとえば、参照によってプロパティを渡すことができます。 C#ではこれを許可していません。

同様に、Option Strictをオフにすると、VBでは、宣言されたパラメータのサブタイプである引数を使用できます。短いが完全なプログラムとして、これを検討してください:

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 

これはVBで動作しますが、C#で同等の機能はないとの理由があります。それは危険だ。この場合、我々は、文字列変数を使用していると、私たちは別の文字列を参照するために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にその価値について何かノートを追加しました。この設定は、デフォルトでオンになっている必要があります。 –

関連する問題