如何在VB.NET中适配含in-struct参数的C#委托?
问题解决:VB.NET适配C#带
in参数的委托 问题背景
C#中定义了如下结构体与委托:
struct Dummy {} delegate int ReceiveDummy(in Dummy dummy);
在VB.NET中尝试用ByVal或ByRef定义函数并绑定到该委托时,会触发BC30657错误:“返回类型不受支持或参数类型不受支持”。
解决方案
要匹配C#in参数的语义,VB.NET需要使用**ReadOnly ByRef**声明函数参数——C#的in本质是只读的引用传递,而ReadOnly ByRef正好对应这一行为,既避免值类型拷贝,又限制参数在函数内不可修改。
正确的VB.NET代码实现如下:
Structure Dummy End Structure ' 用ReadOnly ByRef匹配C#的in参数约束 Shared Function MyReceiveDummy(ReadOnly ByRef dummy As Dummy) As Integer ' 函数逻辑:dummy为只读,无法修改其内容 Return 0 End Function ' 成功绑定委托 Dim receive As ReceiveDummy = New ReceiveDummy(AddressOf MyReceiveDummy)
关于VB.NET的in等效语法
VB.NET没有与C#in完全同名的关键字,但ReadOnly ByRef参数可以实现完全等效的语义:
- 均以引用方式传递值类型,避免拷贝开销
- 均对参数施加只读限制,函数内部无法修改参数内容
内容的提问来源于stack exchange,提问作者Sjoerd van Kreel
相关产品推荐
相关产品推荐

