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
相关产品推荐
相关产品推荐

