Vb.net 我是否必须将Label更改为Control以避免可能的运行时错误?

Vb.net 我是否必须将Label更改为Control以避免可能的运行时错误?,vb.net,runtime-error,resharper,Vb.net,Runtime Error,Resharper,在试图净化继承的遗留VB.NET/ASP项目时,我正在对其进行重新精简,它告诉我,“将此行上的“System.Web.UI.Control”转换为“System.Web.UI.WebControl.Label”时可能会发生运行时错误: Dim _UserNameLabel As Label = PortalLogin.FindControl("UserNameLabel") …但当我默许并让它改变它时: Dim _UserNameLabel As Control = PortalLogin.

在试图净化继承的遗留VB.NET/ASP项目时,我正在对其进行重新精简,它告诉我,“将此行上的“System.Web.UI.Control”转换为“System.Web.UI.WebControl.Label”时可能会发生运行时错误:

Dim _UserNameLabel As Label = PortalLogin.FindControl("UserNameLabel")
…但当我默许并让它改变它时:

Dim _UserNameLabel As Control = PortalLogin.FindControl("UserNameLabel")
…此处的“样式”属性显示为红色:

_UserNameLabel.Style("color") = dt1.Rows(0)("TextBoxColor")
是否有其他方法来提供标签/控制颜色,我最好还是忽略Resharper的建议,还是什么?

正确的选择是:

Dim _UserNameLabel = DirectCast(PortalLogin.FindControl("UserNameLabel"), Label)
FindControl
返回的
Control
引用被强制转换为type
Label
,然后您可以访问特定于type
Label
的成员。允许从初始化表达式推断
usernamelab
变量类型的是
Option inferon
。使用
选项推断关闭
时,您需要编写:

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

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

任何一个都不会使用
选项进行编译。FindControl返回一个控件,
样式
不是控件的属性。投回标签。最纯净的将来自打开选项。它可能有助于解决其他难题选项>项目和解决方案>VB默认值>选项显式已启用;选项“严格”已关闭,但。。。选项推断,不管是什么,都是打开的,最后选项比较是二进制的。这些是新项目的默认值。项目属性-->编译-->选项严格打开始终打开。把它调进去,然后把旋钮扯下来。它将阻止您使用隐式转换进行编译(Q中的第一种情况)以及在使用后期绑定时(第二种情况)为什么DirectCast()优先于Resharper使用的CType()?
DirectCast
是真正的强制转换
CType
是一种转换。如果对象已经是目标类型,则不需要进行转换,因此使用包含类型检查的转换函数是没有意义的;我想这取决于ReSharper是否知道对象是它被强制转换为的类型,或者是否需要转换。我从来没有在ReSharper中遇到过这种情况,因为在我开始使用ReSharper之前很久,我就对
选项进行了严格的限制,所以我总是不假思索地添加了必需的强制转换,而且这些天我实际上并没有编写太多VB代码。