6

次の 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# バージョンがコンパイルに失敗するのはなぜですか?

4

1 に答える 1

13

ByRefVB は、C# よりもパラメータがかなり緩いです。たとえば、参照によってプロパティを渡すことができます。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()

次に、実行時に例外が発生します。

未処理の例外: System.InvalidCastException: 型 'Object' から型 'String' への変換は無効です。

基本的refに、C# ではコンパイル時のタイプ セーフですがByRef、Option Strict をオフにした 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 なしでコーディングしていることを示唆しています...できるだけ早く使用することをお勧めします。

于 2013-06-12T05:30:45.877 に答える