2016-12-01 9 views
-3

При попытке очистить унаследованный унаследованный проект VB.NET/ASP, я его перенаправляю, и он говорит мне: «Ошибки выполнения могут возникать при преобразовании« System.Web.UI.Control »в« System.Web » .UI.WebControls.Label»" на этой линии:Обязательно ли я менять Label на Control, чтобы избежать возможной ошибки времени выполнения?

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

... но когда я согласиться и пусть это изменить его к этому:

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

... "собственностью Style" здесь reds up:

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

Есть ли альтернативный способ подачи этого ярлыка/управления цветом, мне лучше не учитывать предложение Решара, или что?

+1

Ни один из них не будет компилироваться с опцией «Option Strict On». FindControl возвращает элемент управления, а 'Style' не является свойством Control. Верните этикетку. – Plutonix

+2

Наибольшее очищение исходит от поворота опции Strict On. Это может помочь решить The Other Mysteries – Plutonix

+0

Опции> Проекты и решения> VB Defaults> Option Explicit уже включен; Option Strict is Off, хотя ... Option Infer, независимо от того, что есть, включен, и, наконец, Option Compare является двоичным. –

ответ

2

Правильный вариант:

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

Control ссылка, возвращенная FindControl отливается как тип Label и вы можете затем члены доступа, специфичные для типа Label. Это Option Infer On, что позволяет выводить тип переменной UserNameLabel из ее инициализирующего выражения. С Option Infer Off вам нужно будет написать:

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

Некоторые люди предпочитают делать это в любом случае, для ясности. Вывод типа часто удобен, но не требуется. Где требуется использовать анонимные типы, возвращаемые запросами LINQ.

+0

Почему DirectCast() предпочитает CType(), что использует Resharper? –

+1

'DirectCast' - подлинный актерский состав. 'CType' - это преобразование. Если объект уже является целевым типом, преобразование не требуется, поэтому нет смысла использовать функцию преобразования, которая включает проверку типов для этой цели. – jmcilhinney

+0

Полезно знать; мы надеемся, что реформаторы слушают. –