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

问题描述

作为初学者,我正在尝试通过使用 select t1.*,t2.num_users from table1 t1 join (select company_id,count(*) as num_users from table2 t2 group by company_id ) t2 on t1.company_id= t2.company_id; 来清理我的方式。除了这个错误,我设法清除了所有错误
我正在使用 ToolStrip 的 Tag 属性获取一些文本信息。单击 ToolStrip,我需要记住字符串中 Tag 的值并更改该 Tag 的值。

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

Option Strict On

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

enter image description here

解决方法

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

获取在 ToolStrip 上单击的项目。

如果要读取此 Item 所属 ToolStrip 的 Tag 属性,请将 sender 转换为 ToolStrip(或 Control,此属性所属的基类)并将其 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?,又名 Elvis)是因为标签可能为空 (Nothing)。如果是,你不会得到异常,只是一个空字符串。

,

很高兴您对问题进行了笼统的命名。你需要一个通用的答案。

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

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

例如

Dim oTxt as object = new TextBox()

oTxt 不会自动拥有属性 Text。你需要cast。当您 100% 知道对象类型时,请执行

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

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

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...