【发布时间】:2021-06-24 14:42:21
【问题描述】:
我正在尝试将用 C# 编写的代码改编为 vb.net 应用程序。在某一时刻,Dictionary 类型的变量被转换为 SortedDictionary 类型的变量。我已经在 vb.net 中重新编写了它,但它会引发错误。此代码需要更改哪些内容才能在 vb.net 中运行?
这是原始的 c# 代码:
var headers = new Dictionary<string, string>();
headers.Add("x-amz-date", requestMoment.ToString("yyyyMMddTHHmmssZ"));
headers.Add("x-amz-access-token", txtOAuthToken.Text);
headers.Add("host", "sellingpartnerapi-na.amazon.com");
SortedDictionary<string, string> sortedHeaders = new SortedDictionary<string, string>(headers);
这是我的 vb.net 代码:
Dim headers = New Dictionary(Of String, String)()
headers.Add("x-amz-date", requestMoment.ToString("yyyyMMddTHHmmssZ"))
headers.Add("x-amz-access-token", gblOAuthToken)
headers.Add("host", "sellingpartnerapi-na.amazon.com")
Dim sortedHeaders As SortedDictionary(Of String, String) = New SortedDictionary(Of String, String)(headers)
c# 工作正常。在vb.net代码中,最后一行抛出这个错误
重载解析失败,因为在没有缩小转换的情况下无法调用可访问的“新建”: 'Public Overloads Sub New(dictionary As IDictionary(Of String, String))':参数匹配参数 'dictionary' 从 'Object' 缩小到 'IDictionary(Of String, String)'。 'Public Overloads Sub New(comparer As IComparer(Of String))':自变量匹配参数 'comparer' 从 'Object' 缩小到 'IComparer(Of String)'。
【问题讨论】:
-
你有
Option Infer On吗?为什么不呢? -
@GSerg 默认情况下它是关闭的,因此可以安全地假设 OP 没有使用 infer。鉴于此,
headers应该声明为Dim headers as Dictionary,否则它会得到Object的类型,这会混淆重载决议。要么在SortedDictionary构造函数中将headers显式转换为IDictionary。 -
只需将字典声明为
Dim headers As IDictionary(Of String, String) = New Dictionary(Of String, String)()。或Dim headers As New Dictionary(Of String, String)()。将所有Options设置为On,C# 样式。你很好。 -
@GSerg Setting infer on 解决了这个问题。你能解释一下它的作用以及为什么在 vb.net 中而不是在 C# 中需要它吗?我主要是 C# 程序员,但这是一个用 vb.net 编写的旧公司应用程序。谢谢你的帮助!
-
@boilers222 通过单击我评论中的链接,您可以看到什么。它在 VB.NET 中是必需的,因为 VB.NET 在默认情况下对类型放宽,这与 C# 不同,其中
var总是像Dim和Infer On一样工作。
标签: c# vb.net dictionary sorteddictionary