Visual Basic 16不支持为Init-only属性赋值或按引用传递问题咨询
解决VB中初始化C# init-only属性对象的报错问题
问题原因
C#中用init关键字定义的仅初始化属性,仅允许在对象构造阶段赋值。而VB 16早期版本的对象初始化器,默认是在对象构造完成后尝试按引用传递属性进行赋值,这违反了init-only属性的访问限制,因此触发错误:Visual Basic 16 does not support assigning to or passing byref properties with init-only setters。
解决方案
1. 使用构造函数初始化(推荐)
如果NuGet包中的类提供了包含目标属性的构造函数,直接通过构造函数传入参数初始化,完全避开对象初始化器的语法限制:
' 假设类有对应构造函数,按参数名或位置传值 Dim targetObj As New NuGetTargetClass(PropName1:= "初始化值1", PropName2:= 456)
2. 升级VB版本并使用正确的对象初始化器
确保你的Visual Studio 2022已更新到最新版本(对应VB 16.9及以上),此时VB支持在构造阶段通过With块初始化init-only属性,写法如下:
Dim targetObj As New NuGetTargetClass With { .PropName1 = "初始化值1", .PropName2 = 456 }
3. 反射兜底方案(不推荐)
如果上述两种方案无法实施(比如类无合适构造函数、无法升级VB版本),可以用反射绕过init-only限制(注意:此方式违背属性的设计意图,仅作为临时兜底):
Dim targetObj As New NuGetTargetClass() ' 获取目标属性 Dim prop = GetType(NuGetTargetClass).GetProperty("PropName1") ' 强制赋值 prop.SetValue(targetObj, "初始化值1")
内容的提问来源于stack exchange,提问作者Par A
相关产品推荐
相关产品推荐

