【问题标题】:Is it imperative that I change Label to Control to avoid a possible runtime error?是否必须将 Label 更改为 Control 以避免可能的运行时错误?
【发布时间】:2016-12-01 23:00:39
【问题描述】:

在尝试净化继承的遗留 VB.NET / ASP 项目时,我正在对其进行重新锐化,它告诉我,“将 'System.Web.UI.Control' 转换为 ' 时可能会出现运行时错误System.Web.UI.WebControls.Label'" 在这一行:

Dim _UserNameLabel As Label = PortalLogin.FindControl("UserNameLabel")

...但是当我默认并让它改成这样时:

Dim _UserNameLabel As Control = PortalLogin.FindControl("UserNameLabel")

...这里的“Style”属性变红了:

_UserNameLabel.Style("color") = dt1.Rows(0)("TextBoxColor")

是否有另一种方法可以为该标签/控件提供颜色,我最好忽略 Resharper 的建议,还是什么?

【问题讨论】:

  • 两者都不会使用Option Strict On 编译。 FindControl 返回一个 Control,Style 不是 Control 的属性。将退货投给标签。
  • 最大的净化来自于打开 Option Strict。它可能有助于解决其他谜团
  • 选项 > 项目和解决方案 > VB 默认值 > 选项显式已打开;不过,Option Strict 是 Off...Option Infer,不管是什么,都是 On,最后 Option Compare 是 Binary。
  • 这些是新项目的默认值。 项目属性 --> 编译 --> Option Strict On 始终打开。将其调入并撕下旋钮。它会阻止您使用隐式转换(Q 中的第一个场景)和使用后期绑定(第二个)进行编译

标签: vb.net runtime-error resharper


【解决方案1】:

正确的选项是:

Dim _UserNameLabel = DirectCast(PortalLogin.FindControl("UserNameLabel"), Label)

FindControl 返回的Control 引用被转换为Label 类型,然后您可以访问特定于Label 类型的成员。正是Option Infer On 允许从其初始化表达式推断UserNameLabel 变量的类型。使用Option Infer Off,您需要编写:

Dim _UserNameLabel As Label = DirectCast(PortalLogin.FindControl("UserNameLabel"), Label)

为了清楚起见,无论如何,有些人更喜欢这样做。类型推断通常很方便,但不是必需的。需要使用 LINQ 查询返回的匿名类型。

【讨论】:

  • 为什么 DirectCast() 优于 Resharper 使用的 CType()?
  • DirectCast 是真正的演员。 CType 是一种转换。如果对象已经是目标类型,则不需要转换,因此使用包含类型检查的转换函数是没有意义的。
  • 很高兴知道;希望 Resharperers 正在倾听。
  • 我想这取决于 ReSharper 是否可以知道该对象是它被转换为的类型,或者是否需要进行转换。我从来没有真正从 ReSharper 遇到过这种情况,因为在我开始使用 ReSharper 之前很久我就有了Option Strict On,所以我总是不假思索地自己添加了所需的强制转换,而且这些天我实际上并没有写太多的 VB 代码。跨度>
猜你喜欢
  • 2014-06-15
  • 2017-05-31
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
相关资源
最近更新 更多