问题描述
我有一个用 vb.net 编写的项目,.net 版本是 3.5,它运行良好,没有任何问题,现在我决定将其转换为 c#。我使用的不仅仅是工具,比如 Instantc#、vbconversion,还有 Visual Studio 的扩展,所有这些都给了我后期绑定图像的错误: 左侧是 vb.net 代码,右侧是转换为(即 c#)
请帮助我如何在 vb 代码中解决此问题,以便转换正常或在 c# 代码中。
解决方法
后期绑定错误
默认情况下,C# 在数据类型方面比 VB 更严格。 VB 可以让你将任何东西分配给一个对象,并编写代码来调用它的方法,如果你认为它们在那里的话:
Dim o as Object
o = "hello"
Console.Write(o.Length) 'length of string
如果 Option Strict
是 On
,VB 不允许您这样做 - 默认情况下它是关闭的,这可能是 VB.NET 程序中错误的第一大原因。它还鼓励草率的编码习惯
C# 不会让你这样做* - 你必须一直严格和准确,如果你已经将一个字符串分配给一个对象,那么你必须通过在你之前进行强制转换来证明你知道其中的内容可以使用:
Object o;
o = "hello";
Console.Write(((string)o).Length) 'cast o to string,then get length of string
一直在做这种转换真的很乏味,因为预先声明正确的类型要容易得多:
String o;
o = "hello";
Console.Write(o.Length)
后期绑定是一个特性,它可以让你在编译时跳过严格的限制,编译器只会假设你是对的,并在运行时自己弄清楚对象变量内部是什么样的东西。如果它是一个字符串,那么 Length 就可以正常工作。如果它是一个没有 Length
的整数,你会崩溃
所以,因为 object
没有 SetDataSource
方法;您必须在编译时声明正确的 rpt
类型。如果它是某个 CrystalReports ReportViewer 类,那么您确实必须将其声明为
using CrystalReports;
...
ReportViewer rpt;
if(...)
rpt.SetDataSource(...);
*有办法,但不利于学习,我就不讲了