{"id":1033,"date":"2009-11-03T18:32:00","date_gmt":"2009-11-03T18:32:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vbteam\/2009\/11\/03\/spot-the-bug-much-ado-about-nothing-jonathan-aneja\/"},"modified":"2024-07-05T12:42:42","modified_gmt":"2024-07-05T19:42:42","slug":"spot-the-bug-much-ado-about-nothing-jonathan-aneja","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/vbteam\/spot-the-bug-much-ado-about-nothing-jonathan-aneja\/","title":{"rendered":"Spot the Bug! &#8211; Much Ado about Nothing&#8230; (Jonathan Aneja)"},"content":{"rendered":"<p class=\"MsoNoSpacing\"><font face=\"Calibri\"><span lang=\"EN\"><font size=\"3\">Microsoft has this neat mailing list called \u201cSpot the Bug\u201d where developers can send interesting snippets of code that look correct but actually have subtle bugs in them.&nbsp; The puzzles are a lot of fun and I\u2019ve always thought it\u2019d be a fun thing to try here on the team blog.&nbsp; Over the past year or so I\u2019ve been keeping a list of interesting bug reports and emails where people have been tripped up by some of VB\u2019s hidden subtleties (though admittedly many of these could apply to C# as well).<\/font><\/span><\/p>\n<p class=\"MsoNoSpacing\"><span lang=\"EN\"><font size=\"3\">&nbsp;<\/font><\/span><\/p>\n<p class=\"MsoNoSpacing\"><span lang=\"EN\"><font size=\"3\">The format\u2019s gonna be a bit of an experiment \u2013 let me know if you prefer to see the answer in the same post or posted a day later.&nbsp; Alright let\u2019s get started\u2026<\/font><\/span><\/p>\n<p class=\"MsoNoSpacing\"><span lang=\"EN\"><font size=\"3\"><\/font><\/span>&nbsp;<\/p>\n<p><\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\"><strong>Spot the Bug:<\/strong>&nbsp;<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">The following code is intended to print \u201cYes\u201d \u2013 will it?<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> x <span>As<\/span> <span>Integer<\/span>? = <span>Nothing<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>If<\/span> x = <span>Nothing<\/span> <span>Then<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>MsgBox(<span>&#8220;Yes: x contains null&#8221;<\/span>)<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Else<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>MsgBox(<span>&#8220;No: x does not contain null, and has a real value&#8221;<\/span>)<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>End<\/span> <span>If<\/span><\/span><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">.<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">.<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">.<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">.<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">.<\/font><\/p>\n<p class=\"MsoNoSpacing\"><b><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/b><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\"><font face=\"Calibri\"><b>Answer:<span>&nbsp; <\/span><\/b>No!<span>&nbsp; <\/span>We\u2019re using the equality operator to compare a nullable integer with Nothing \u2013 this results in <i>null propagation<\/i>, i.e. the result of the expression is Nothing.<span>&nbsp; <\/span>An If-statement attempts to convert its condition to a Boolean, so basically we\u2019re left with this:<\/font><\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>If<\/span> <span>Nothing<\/span> <span>Then<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Else<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&#8216;Obviously we&#8217;ll always land here<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>End<\/span> <span>If<\/span><\/span><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">This can be really surprising when working with nullables, so we\u2019ve decided to add a warning for this case in VB10:<\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">&nbsp;<img decoding=\"async\" title=\"New null-popagation warning in VB10\" alt=\"New null-popagation warning in VB10\" src=\"https:\/\/devblogs.microsoft.com\/vbteam\/wp-content\/uploads\/sites\/7\/2009\/11\/null20propagation.jpg\" width=\"628\" height=\"206\"><\/font><\/p>\n<p class=\"MsoNoSpacing\"><span><font size=\"3\"><font face=\"Calibri\"><\/font><\/font><\/span><\/p>\n<p class=\"MsoNoSpacing\"><b><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/b><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">The warning explains the fix \u2013 use \u201cIs\u201d instead of = to avoid the null propagation and get the semantics you expect:<\/font><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> x <span>As<\/span> <span>Integer<\/span>? = <span>Nothing<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>If<\/span> x <span>Is<\/span><span> Nothing<\/span> <span>Then<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>MsgBox(<span>&#8220;Yes: x contains null&#8221;<\/span>)<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Else<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>MsgBox(<span>&#8220;No: x does not contain null, and has a real value&#8221;<\/span>)<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>End<\/span> <span>If<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span><\/span><\/span>&nbsp;<\/p>\n<p><span><span><font color=\"#000000\"><font size=\"3\" face=\"Calibri\"><\/p>\n<p class=\"MsoNoSpacing\">Check back for a similar case but with a bit of a twist tomorrow&#8230;<\/p>\n<p><\/font><\/font><\/span><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Microsoft has this neat mailing list called \u201cSpot the Bug\u201d where developers can send interesting snippets of code that look correct but actually have subtle bugs in them.&nbsp; The puzzles are a lot of fun and I\u2019ve always thought it\u2019d be a fun thing to try here on the team blog.&nbsp; Over the past year [&hellip;]<\/p>\n","protected":false},"author":260,"featured_media":8818,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[195],"tags":[83,143,165,166,167],"class_list":["post-1033","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-visual-basic","tag-jonathan-aneja","tag-spot-the-bug","tag-vb2005","tag-vb2008","tag-vb2010"],"acf":[],"blog_post_summary":"<p>Microsoft has this neat mailing list called \u201cSpot the Bug\u201d where developers can send interesting snippets of code that look correct but actually have subtle bugs in them.&nbsp; The puzzles are a lot of fun and I\u2019ve always thought it\u2019d be a fun thing to try here on the team blog.&nbsp; Over the past year [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/1033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/users\/260"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/comments?post=1033"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/1033\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media\/8818"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media?parent=1033"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/categories?post=1033"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/tags?post=1033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}