【问题标题】:how to avoid late binding in vb.net如何避免 vb.net 中的后期绑定
【发布时间】:2021-07-29 11:44:50
【问题描述】:

我有一个用 vb.net 编写的项目,.net 版本是 3.5,它运行良好,没有问题,现在我决定将其转换为 c#。我使用的不仅仅是工具,比如 Instantc#、vbconversion,还有 Visual Studio 的扩展,它们都给了我后期绑定图像的错误: 左边是vb.net代码,右边是转换成(即c#)

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

请帮助我如何在 vb 代码中或在 c# 代码中解决这个问题。

【问题讨论】:

  • 我在代码的任何一侧都看不到问题。你能解释更多吗?
  • 另外,你的VB代码中有Option Strict On吗?
  • 请勿张贴代码图片。将实际代码发布为文本,以便我们更轻松地处理它。
  • 选项严格关闭
  • 明确地说,Option Strict On 不允许后期绑定和隐式缩小转换。摆脱那些 VBisms,您应该几乎能够直接转换为 C#。无论如何,您的所有 VB 项目中都应该有 Option Strict On。它应该在 VS 选项中设置为On,以便在所有新项目中默认为On。一旦你设置它On,编译器将标记所有问题,你可以通过为所有变量等使用正确的类型来修复每个问题,并显式执行所有强制转换和转换。

标签: c# vb.net datagridview late-binding vb.net-to-c#


【解决方案1】:

后期绑定的错误

默认情况下,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 类,那么你真的必须声明它

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

rpt.SetDataSource(...);

*是有办法的,但我不会深入,因为它不利于学习

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多