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, 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
我正在尝试通过使用 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, 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