如何避免 vb.net 中的后期绑定

how to avoid late binding in vb.net

我有一个用 vb.net 编写的项目。.net 版本是 3.5,它运行良好,没有任何问题,现在我决定将它转换为 C#。我使用的不仅仅是工具,比如 instantc#、vbconversion,还有 visual studio 的扩展,所有这些都让我看到图像的后期绑定错误: 左侧是 vb.net 代码,右侧是转换为(即 c#)

在另一个地方也有同样的错误见图片:

请帮助我如何在 vb 代码中或在 c# 代码中解决此问题,以便转换正常。

the error of late binding

默认情况下,C# 在数据类型方面比 VB 更严格。 VB 可以让您将任何东西分配给一个对象,并编写调用方法的代码,如果您认为它们在那里的话:

Dim o as Object
o = "hello"

Console.Write(o.Length) 'length of string
如果 Option StrictOn

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 class 那么你真的必须声明它

using CrystalReports;
...
ReportViewer rpt;
if(...)

rpt.SetDataSource(...);

*方法有很多,但我不会深入研究,因为它不利于学习