Ant*_*ony 6 c# vb.net vb.net-to-c# .net-2.0
以下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)
Run Code Online (Sandbox Code Playgroud)
以下C#代码无法编译:
LearnerLogbookReportRequest request = new LearnerLogbookReportRequest();
request.LearnerIdentityID = theLearner.ID;
request.EntryVersion = LearnerLogbookEntryVersion.Full;
IReportRequestService reportRequestService = ServiceFactory.GetReportRequestService(ServiceInvoker.LearnerLogbook);
reportRequestService.SaveRequest(ref request);
Run Code Online (Sandbox Code Playgroud)
LearnerLogbookReportRequest声明为:
Public Class LearnerLogbookReportRequest
Inherits AbstractReportRequest
Run Code Online (Sandbox Code Playgroud)
错误:
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
Run Code Online (Sandbox Code Playgroud)
为什么C#版本无法编译?
Jon*_*eet 13
VB ByRef比C#更宽松.例如,它允许您通过引用传递属性.C#不允许这样做.
以类似的方式,在Option Strict off时,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
Run Code Online (Sandbox Code Playgroud)
这适用于VB,但C#中的等价物不会......并且有充分的理由.这很危险.在这种情况下,我们使用字符串变量,我们碰巧更改p为引用另一个字符串,但是如果我们将主体更改Foo为:
p = new Object()
Run Code Online (Sandbox Code Playgroud)
然后我们在执行时得到一个异常:
未处理的异常:System.InvalidCastException:从类型'Object'到类型'String'的转换无效.
ref在C#中基本上是编译时类型安全的,但ByRef在VB中使用Option Strict off时它不是类型安全的.
如果你添加:
Option Strict On
Run Code Online (Sandbox Code Playgroud)
然而,在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)
~
Run Code Online (Sandbox Code Playgroud)
这表明您目前正在编写没有Option Strict ...我建议尽快使用它.
| 归档时间: |
|
| 查看次数: |
379 次 |
| 最近记录: |