Option Strict On 不允许 String 和 Object {String} 之间的隐式转换

Option Strict On disallows implicit conversions between String and Object {String}

我正在尝试通过使用 Option Strict On 来清理我作为初学者程序员的方式。我设法清除了除此错误之外的所有错误。
我正在使用 ToolStrip 的 Tag 属性 来获取一些文本信息。单击ToolStrip,我需要记住字符串中Tag 的值并更改该Tag 的值。

如何将 Object {String} sender.tag 转换为 StringString myString 和一个 Object {String}?

Private Sub ToolStrip_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles ToolStrip.ItemClicked
    Dim myString As String = sender.tag
    sender.tag = "It is selected"
    'more code...
End Sub

编辑:请在此处查看代码相关部分的屏幕截图:

如果您想读取 ToolstripItem, you need to read the Tag of the Item selected. This is provided by the e.ClickedItem property of the ToolStripItemClickedEventArgs 对象的标签 属性:

Gets the item that was clicked on the ToolStrip.

如果要读取此项目所属的 ToolStrip 的标签 属性,将 sender 转换为 ToolStrip(或控件,基础 class 此 属性属于)并将其 Tag 属性 转换为 String.

注意:当您双击 ToolStrip 控件时,将创建一个 ItemClicked 处理程序,因为这是 default event of that Control。该事件与 ToolStrip 对象相关,因此事件处理程序中的 sender 对象将是引发该事件的 ToolStrip 实例的引用。

Tag Property 是类型 Object,这就是为什么你也需要转换它。

Private Sub ToolStrip_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles ToolStrip.ItemClicked
    Dim itemTagAsString As String = e.ClickedItem.Tag?.ToString()

    Dim toolStripTagAsString = DirectCast(sender, ToolStrip).Tag?.ToString()
    ' Or, cast to Control, the Tag Property belongs to the base class
    Dim toolStripTagAsString = DirectCast(sender, Control).Tag?.ToString()
End Sub

检查这些示例中 itemTtag 的类型(使用 Option Infer On):

Dim itemTtag = e.ClickedItem.Tag
Dim itemTtag = e.ClickedItem.Tag?.ToString()

所以更清楚为什么这不是一个有效的陈述:

Dim itemTtag As String = e.ClickedItem.Tag

注意:此处使用 null conditional operator?,又名猫王),因为标签可能为空 (Nothing)。如果是,你不会得到异常,只是一个空字符串。

很好,您对问题的标题很笼统。你需要一个通用的答案。

Option Strict On 是个好东西。它使编码更难,但运行时的性能会提高,因为隐式数据类型转换会更少。

让我们把你的代码 ...sender As Object......sender.tag.. 这是 .net 中的典型事情。通常你会看到object类型的参数,这意味着,可以传递任何数据类型。 Object 没有定义属于该数据类型的所有属性和方法。

例如

Dim oTxt as object = new TextBox()

oTxt不会自动有属性Text。你需要cast。当你 100% 知道 object 类型时,做

dim str as string = DirectCast(oTxt, TextBox).Text

但有时您并不知道 object 中的 Type 是什么。在这种情况下,您尝试转换然后检查 null

dim txtBx as TextBox = TryCast(oTxt, TextBox)
if txtBx IsNot Nothing Then str = txtBx.Text

你真正的问题是你需要理解类型转换。即使你没有 Options Strinct On 你也应该明确地转换它,因为当你隐式地做 x = sender.tag 时,你实际上使用了 后期绑定 ,这对性能不利.这也为潜在的运行时错误打开了大门。

您的研究主题应该是:类型转换、后期绑定、boxing/unboxing