繁体   English   中英

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 转换为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

编辑:请参见此处代码相关部分的屏幕截图:

在此处输入图像描述

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

获取在 ToolStrip 上单击的项目。

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

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

Tag 属性的类型为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 条件运算符? ,又名 Elvis),因为标签可能是 null( 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时,您实际上使用的是后期绑定,这对性能不利。 这也为潜在的运行时错误打开了大门。

你的研究主题应该是:类型转换、后期绑定、装箱/拆箱

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM