gpt4 book ai didi

c# - 为什么我的代码在 VB.NET 中编译但 C# 中的等效代码失败

转载 作者:太空狗 更新时间:2023-10-29 21:05:00 34 4
gpt4 key购买 nike

以下 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#版本编译失败?

最佳答案

VB 在 ByRef 参数方面比 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()

然后我们在执行时得到一个异常:

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

基本上 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 进行编码...我建议您尽快使用它。

关于c# - 为什么我的代码在 VB.NET 中编译但 C# 中的等效代码失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17058201/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com