簡體   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