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

Flo*_*rin 1 vb.net toolstripitem toolstrip winforms

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

如何将Object {String} sender.tag 转换为String以及String 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
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

Jim*_*imi 6

如果要读取ToolstripItem的 Tag 属性,则需要读取所选 Item 的 Tag。这是由ToolStripItemClickedEventArgs对象的e.ClickedItem属性提供的:

获取在 ToolStrip 上单击的项目。

如果要读取此 Item 所属的 ToolStrip 的 Tag 属性,则转换sender为 ToolStrip(或 Control,此属性所属的基类)并将其 Tag 属性转换为 String。

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

标签属性是类型的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
Run Code Online (Sandbox Code Playgroud)

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

Dim itemTtag = e.ClickedItem.Tag
Dim itemTtag = e.ClickedItem.Tag?.ToString()
Run Code Online (Sandbox Code Playgroud)

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

Dim itemTtag As String = e.ClickedItem.Tag
Run Code Online (Sandbox Code Playgroud)

注意:此处使用空条件运算符( ?,又名 Elvis) 是因为标签可能为空 ( Nothing)。如果是,您不会得到异常,只是一个空字符串。