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

C#转VB:New...With语法下只读属性赋值问题求助

解决VB中DefaultRequestHeaders只读属性无法初始化赋值的问题

我完全懂你这个困扰——明明C#里能轻松在初始化时配置DefaultRequestHeaders,换到VB就报“Property DefaultRequestHeaders is ReadOnly”,这俩语言的语法差异确实容易踩坑。

先搞懂本质:C#的写法不是“赋值”只读属性

你看到的C#代码比如这样:

var httpClient = new HttpClient()
{
    DefaultRequestHeaders =
    {
        Accept = { new MediaTypeWithQualityHeaderValue("application/json") }
    }
};

其实并没有给DefaultRequestHeaders这个只读属性赋值——它只是利用C#对象初始化器的语法糖,访问HttpClient构造函数已经创建好的DefaultRequestHeaders实例,然后对它的Accept集合进行初始化(底层是调用集合的Add方法)。

VB的正确写法

VB不支持C#那种“嵌套属性初始化”的语法糖,所以你得换两种方式实现:

方式1:分步操作(最直观不易错)

先实例化HttpClient,再直接调用Accept集合的Add方法:

Dim httpClient As New HttpClient()
httpClient.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))

方式2:VB对象初始化器结合集合初始化

如果你想在初始化时完成配置,VB也支持集合初始化语法,只要你不尝试给DefaultRequestHeaders本身赋值,而是直接操作它的Accept成员:

Dim httpClient As New HttpClient() With {
    .DefaultRequestHeaders.Accept = { New MediaTypeWithQualityHeaderValue("application/json") }
}

这种写法和C#的效果一致,都是操作已存在的DefaultRequestHeaders实例,而不是给只读属性赋值。

为什么你之前的代码报错?

大概率是你在VB里尝试了类似这样的写法:

' 错误写法!尝试给只读属性赋值
Dim httpClient As New HttpClient() With {
    .DefaultRequestHeaders = New HttpRequestHeaders() With { ... }
}

这就直接违反了DefaultRequestHeaders是只读属性的规则,自然会报错。记住:永远不要尝试给只读属性赋值,而是操作它已经存在的实例的成员。

内容的提问来源于stack exchange,提问作者Trevortni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:58:14