You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:06:07