Show/Hide Toolbars

XSharp

 

-vo7 选项指示编译器允许 Visual Objects 中允许、但在 X# 中通常是非法或需要显式转换的隐式转换。

语法

-vo7[+|-]

参数

+ | - 指定 + 或 -vo7,可指示编译器允许 Visual Objects 中允许的某些隐式转换。

备注

Visual Objects允许在具有不同语义的类型之间进行隐式转换,而X#通常在这种情况下需要显式转换。

 

例如,Visual Objects允许在整数类型和指针类型之间进行隐式转换。虽然指针是整数,但它们具有不同的语义。整数是数值,指针是表示内存位置的地址。除了语义上的差异外,指针的大小取决于底层平台,而整数的大小不会因平台而异(System.IntPtr除外)。

 

虽然可能(通常是必要的)在具有不同语义的类型之间进行转换,但应始终通过显式转换来完成。这不仅确保生成正确的转换代码(如果需要),还自我记录了您正在将一个类型转换为具有不同含义的另一个类型的事实。

From

To

已执行的操作

PTR

strongly typed PTR (e.g. INT PTR)

无,这些类型是二进制兼容的。但是,如果指针指向的数据类型不正确,代码运行时可能会失败。

INT or DWORD

strongly typed PTR (e.g. INT PTR)

无,这些类型是二进制兼容的。不过,如果指针指向的数据类型不正确,代码运行时可能会失败。请注意,只有当目标平台设置为 x86 时,才允许进行这种转换。

INT64 or UINT64

strongly typed PTR (e.g. INT PTR)

无,这些类型是二进制兼容的。不过,如果指针指向的数据类型不正确,代码运行时可能会失败。请注意,只有当目标平台设置为 x64 或 Itanium 时,才允许进行这种转换。

OBJECT

any other reference type

编译器插入了一个显式的目标类型转换,运行时可能会失败。

type PTR

REF type

编译器会将指针转换为引用。请注意,即使使用 -vo7,也不能将所有指针转换为引用,否则会影响垃圾回收器的完整性。

 

要在 Visual Studio 开发环境中设置该编译器选项,请执行以下操作

 

1.打开项目的 "属性"页面

2.点击 Dialect 选项卡

3.更改值

4.查看属性页

示例

下面的代码在 Visual Objects 中是有效的,但在 X# 中却无法编译,除非使用 -vo7,因为 CreateObject()返回 OBJECT,而且没有从 OBJECT 到更派生类型的隐式转换(这种转换不能保证安全,隐式转换总是安全的)。

CLASS foo
...
END CLASS
 
FUNCTION Start() AS VOID
LOCAL f AS foo
LOCAL s AS SYMBOL
s := #foo
f := CreateObject( s ) // 没有从 "OBJECT "到 "foo "的隐式转换
RETURN

 

使用 -vo7 的效果与将赋值改写为 f 的效果相同:

f := (foo) CreateObject( s )

 

无论哪种情况,生成的代码都是完全相同的,而且在运行时,向 foo 的投递可能会失败。但是,显式转置自我证明了您期望 CreateObject() 的返回值包含 foo 的实例。

 

下面的示例在 Visual Objects 中也有效,但除非使用 -vo7,否则无法在 X# 中编译,因为 @ 操作符返回其操作数(类型化指针)的地址,而指针在 X# 中与引用不同:

LOCAL x AS INT
ByRef( @x )
 
...
 
FUNCTION ByRef( i REF INT ) AS VOID
i := 5
RETURN

 

选项 -vo7 会自动将解析为 INT PTR 类型的 @x 转换为与函数参数兼容的 REF INT。不过,我们建议您删除 @ 操作符,而不是使用 -vo7 来实现这一目的。