选项 Strict On 禁止晚期绑定。

12

有人能帮我修复这个错误吗?

Option Strict On 禁止晚期绑定。

这是导致错误的代码:

Dim SF6StdData As BindingSource = New BindingSource() 
' ...
If StrComp(SF6StdData.Current("O2AreaCts").ToString, "") = 0 Then
    AreaCts(3) = 0
Else
    AreaCts(3) = Convert.ToDouble(SF6StdData.Current("O2AreaCts").ToString)
End If

我需要改写这段代码,以便它不会出现任何错误。我知道可以通过在项目属性中将 "Option Strict" 设置为 "Off" 来解决此问题,但我真的不想这样做。有其他的方法吗?


1
你想要修复哪个错误? - David W
3
什么错误?您没有说出您在哪一行收到了什么错误。同时,请分享StrComp函数,因为它不是标准的VB函数。 - Joel Coehoorn
1
StrComp是标准VB函数-这里的调用是合适的,因此错误 '可能' 与 'AreaCts' 索引器分配有关,但谁知道呢。 - Dave Doknjas
在这种情况下,您可以使用String.IsNullOrEmpty/Whitespace。 - StingyJack
4个回答

17
在启用Option Strict时,不允许使用后期绑定(Late binding)。如果需要执行后期绑定,则唯一的选择是使用反射或关闭Option Strict。然而,令人欣慰的是,您不必为整个项目关闭Option Strict,可以将其保留在项目中,然后只需在需要执行后期绑定的任何代码文件顶部添加一行Option Strict Off。虽然这不是一个很好的解决方案,但比影响整个项目要好。

此外,由于在文件顶部放置的Option Strict只适用于该文件,甚至不必应用于整个类。如果将类分成多个Partial Class文件,则可以为每个文件设置不同的Option Strict。例如,如果您将大部分类放在一个具有Options Strict On的文件中,然后只在一个单独的文件中的Partial Class中放置一个方法,并使用Option Strict Off,则只有该方法会以松散的方式编译。其余类将使用严格规则进行编译。

1
@David W 如果您读了标题,您就会知道我遇到了什么错误。 - mike
1
我有一些代码,只有在 strict = off 的情况下才能正常工作,但我不想禁用它。谢谢! - Anonymous Pi
3
更好的解决方案是将类分成早期绑定和晚期绑定两部分。然后,您可以创建两个部分类并仅为晚期绑定部分使用Option Strict Off选项来实现。 - Matt Wilko
1
@MattWilko 非常好的观点。我很惊讶自己没有提到那个选项。我更新了我的答案,把那个选项加进去了。谢谢! - Steven Doggart
在我的情况下解决方案是:一个DataGridView包含一个DataSource属性(一个对象)。要从该对象获取任何数据(例如TableName),我在Form1类上添加了Partial,并创建了一个独立源文件中的类,该类与同一Partial Class Form1具有1个函数,该函数以Datagridview作为参数并返回Datagridview.DataSource.TableName。这个新文件中的第一行是Option Strict Off。 - Martin

3
这是一篇旧帖,但我仍然遇到了“Option Strict On不允许晚期绑定”的错误。也许另一个答案会对其他人有所帮助。当您尝试将SF6StdData bindingsource中的数据转换为字符串时,可能会出现问题。您可以通过定义具有所需类型的本地变量,然后使用Ctype将数据提取到正确的类型中来解决这个问题。以下是我解决类似问题的示例。
以下代码给我带来了晚期绑定的错误:
    Friend Function CountNumCheckedInGroupbox(ByVal gbox As GroupBox, ByRef nameschecked() As String) As Integer
        Dim numchecked As Integer = 0
        For Each ctrl In gbox.Controls
            If TypeOf ctrl Is CheckBox Then                
                If ctrl.Checked = True Then
                    nameschecked(numchecked) = ctrl.Text
                    numchecked += 1
                End If
            End If
        Next
        Return numchecked
    End Function

在我引用“ctrl.Checked”和“ctrl.Text”时出现了后期绑定错误。
而不是直接引用“ctrl”,我定义了一个类型为Checkbox的变量cbox。然后我从“ctrl”中提取信息到cbox中。现在代码不会显示后期绑定错误。
    Friend Function CountNumCheckedInGroupbox(ByVal gbox As GroupBox, ByRef nameschecked() As String) As Integer
        Dim numchecked As Integer = 0
        Dim cbox As CheckBox
        For Each ctrl In gbox.Controls
        If TypeOf ctrl Is CheckBox Then
                cbox = CType(ctrl, CheckBox)
                If cbox.Checked = True Then
                    nameschecked(numchecked) = cbox.Text
                    numchecked += 1
                End If
            End If
        Next
        Return numchecked
    End Function

使用TypeOf命令解决了我的问题。 - Roger Perkins

3

1
如果您在声明变量 AreaCts 时没有指定类型,例如:
Dim AreaCts as Array

尝试

Dim AreaCts() as Double

这个代码解决了我的后期绑定错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接