【问题标题】:Localizable Option Strict in VB.NET IDEVB.NET IDE 中的 Localizable Option Strict
【发布时间】:2013-10-09 04:43:15
【问题描述】:

在创建新项目时,VB.NET IDE 会自动将 Option Strict 默认设置为 Off。
因此,我经常将 Option Strict On 作为一种良好的编程习惯放在我的文件顶部,并且对于该文件应用 Option Strict 规则。

现在(一段时间),在创建新项目时,我在项目的 properties/compile 下将 Option Strict 设置为 On,以便应用于整个项目,而无需在每个文件上指定。

但是现在我在我的项目下使用了一个外国程序,其中数据类型对我来说并不完全清楚,我想为项目中的所有文件保留 Option Strict,除了那个。

我尝试在该文件顶部使用 Option Strict Off,但这似乎还不够。在我的 IDE/Errors 选项卡下列出了许多典型错误。

如何在项目的编译器属性下为项目下的一个文件关闭选项严格打开

Public Class ApplicationBar
Inherits NativeWindow

' Debugging Mode On/Off
#Const DEBUG_MODE = False

' SetWindowLong selectors
Const GWL_WNDPROC = -4&

' Windows messages
Const WM_ACTIVATE = &H6
Const WM_GETMINMAXINFO = &H24
Const WM_ENTERSIZEMOVE = &H231
Const WM_EXITSIZEMOVE = &H232
Const WM_MOVING = &H216
Const WM_NCHITTEST = &H84
Const WM_NCMOUSEMOVE = &HA0
Const WM_SIZING = &H214
Const WM_TIMER = &H113
Const WM_WINDOWPOSCHANGED = &H47

' WM_SIZING Selectors
Const WMSZ_LEFT = 1
Const WMSZ_RIGHT = 2
Const WMSZ_TOP = 3
Const WMSZ_TOPLEFT = 4
Const WMSZ_TOPRIGHT = 5
Const WMSZ_BOTTOM = 6
Const WMSZ_BOTTOMLEFT = 7
Const WMSZ_BOTTOMRIGHT = 8

' Appbar messages
Const ABM_NEW = &H0
Const ABM_REMOVE = &H1
Const ABM_QUERYPOS = &H2
Const ABM_SETPOS = &H3
Const ABM_GETSTATE = &H4
Const ABM_GETTASKBARPOS = &H5
Const ABM_ACTIVATE = &H6
Const ABM_GETAUTOHIDEBAR = &H7
Const ABM_SETAUTOHIDEBAR = &H8
Const ABM_WINDOWPOSCHANGED = &H9
Const ABM_SETSTATE = &HA

' Appbar edges
Const ABE_LEFT = 0
Const ABE_TOP = 1
Const ABE_RIGHT = 2
Const ABE_BOTTOM = 3
Const ABE_UNKNOWN = 4
Const ABE_FLOAT = 5

'Appbar allowed floats
Const ABF_ALLOWLEFT = 1
Const ABF_ALLOWRIGHT = 2
Const ABF_ALLOWTOP = 4
Const ABF_ALLOWBOTTOM = 8
Const ABF_ALLOWFLOAT = 16

' The ABN_* constants are defined here as follows:
'Const ABN_STATECHANGE = &H0
Const ABN_POSCHANGED = &H1
Const ABN_FULLSCREENAPP = &H2
Const ABN_WINDOWARRANGE = &H3

' GetKeyState and GetAsyncKeyState Selectors
Const VK_LBUTTON = &H1
Const VK_RBUTTON = &H2
Const VK_CONTROL = &H11

' MessageBox Selectors
Const MB_OK = &H0&
Const MB_ICONINFORMATION = &H40&

' ModifyStyle Selectors
Const GWL_STYLE = (-16)
Const GWL_EXSTYLE = (-20)
Const WS_CAPTION = &HC00000
Const WS_SYSMENU = &H80000
Const WS_EX_APPWINDOW = &H40000
Const WS_BORDER = &H800000


' SetWindowPos Selectors
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOZORDER = &H4
Const SWP_NOACTIVATE = &H10
Const SWP_DRAWFRAME = &H20

Const HWND_NOTOPMOST = -2
Const HWND_TOPMOST = -1
Const HWND_BOTTOM = 1

' ShowWindow Selectors
Const SW_HIDE = 0
Const SW_SHOW = 5

' WM_ACTIVATE Selectors
Const WA_INACTIVE = 0

'Custom Defaults
Private Const AB_DEF_SIZE_INC As Integer = 1
Private Const AB_DEF_DOCK_SIZE As Integer = 32

' We need a timer to determine when the AppBar should be re-hidden
Const AUTO_HIDE_TIMER_ID = 100
Const SLIDE_DEF_TIMER_INTERVAL = 400 ' milliseconds

' Subclassing function default result
Const INHERIT_DEFAULT_CALLBACK = -1

所有这些变量都带有绿色下划线,因为没有明确声明,并且在 Option Strict On 下被视为错误。

【问题讨论】:

  • +1 用于使用 Option strict。
  • @MarkHall 使用 VB.NET 可能是 -10 ;-)
  • @UweKeim 这是一个小小的打击,但仍然很有趣。我想,任何不能确定blah() 是方法还是数组的语言都应该受到任何嘲笑。
  • 对不起,伙计们,我只是想开一个非常明显的笑话。和往常一样,我非常失败。无意冒犯,我也时常使用 VB.NET(甚至是 VBScript)。
  • @MarkHall 然后我被 OP 的第一句话吓到了:“创建新项目时,VB.NET IDE 默认自动将 Option Strict 设置为 Off”,但我可以认为它是可读的就好像代码被复制并粘贴到另一台计算机上的另一个项目中,而 IDE 设置没有更改。

标签: vb.net


【解决方案1】:

您所描述的应该可以正常工作。在整个项目中使用Option Strict On 是很常见的,但在某些文件上只需将其覆盖为Option Strict Off。因此,您的问题很可能是其他问题。例如,您的问题可能不在于Option Strict,而在于其他选项之一,例如Option ExplicitOption Infer

【讨论】:

  • 有趣。我得出的结论是,这可能是 Option Strict,因为当我在编译器选项卡下将其关闭时,所有这些消息都会消失。消息类似于:“没有 'As' 子句的变量声明;假定的对象类型。”
  • 好像不是。这是一个“AppBar”程序,它没有用 AS 明确声明很多变量,这些都是错误的。我将部分代码附加到我的问题中。
  • 我将该代码复制到一个测试项目中,该项目的地址为Option Strict On。我看到所有错误都说“Option Strict On 要求所有变量声明都有一个 'As' 子句。”然后我将Option Strict Off 添加到文件的第一行,所有错误都消失了。
  • 您是说当您将Option Strict Off 添加到该文件的顶部时,这些错误不会为您消失吗?
  • 是的。经过多次尝试后,我仍然遇到 Option Script On 的典型错误。如果我在 Properties/Compile 上关闭 Option Strict,那么错误就会消失。
【解决方案2】:

在文件顶部设置 Option Strict Off 将正常工作。我们和你做的完全一样(在所有代码文件的顶部添加 Option Strict On)并且还要求在新项目中设置它。

但是,有时需要 Option Strict Off 的情况(例如 Crystal Reports 的某些活动)。在这些情况下,我们只隔离需要 Option Strict Off 的代码,将其移动到自己的文件中,并将指令添加到顶部。

** 基于新代码的更新:

解决问题的方法是在文件顶部除了Option Strict Off之外添加以下内容:

Option Infer On

这将允许 VB 自动确定并为每个对象分配适当的数据类型。

但是:如果您在 Windows API 调用中使用这些值,则必须确保 VB 为您选择的类型是正确的。您可以通过将光标悬停在声明上来做到这一点:VB 将显示完整的类型声明。

如果此文件源自另一个 VB 项目,那么该原始项目几乎肯定在项目属性中设置了 Option Infer On。

【讨论】:

  • 那么我就是不明白为什么这种情况对我不起作用。
  • 尝试将 Option Explicit Off 也添加到文件顶部。
  • 请忽略之前的评论并查看更新的答案。
  • Option Infer On 并没有什么收获。在属性/编译下,我可以通过设置隐式转换和隐式类型将 Option Strict 设置为“自定义”;假设对象为“无”,然后错误消失了,但我认为这似乎不太好。我把所有这些代码都放到了kalko.com.hr/AppBar.txt,所以也许你能看到什么?它会在那里一段时间......
  • 使用 VS2010,该代码中唯一报告的问题是 Public AppBarHeight。添加 As Integer 可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多