C#到VB-TrimStart行为

C#到VB-TrimStart行为,c#,vb.net,string,trim,C#,Vb.net,String,Trim,我有最简单的VB代码: Dim test As String = "DDN8057" Console.WriteLine(test.TrimStart("DDN")) 给我 N8057 为什么??将其转换为C#(我更熟悉),使我意识到TrimStart实际上需要一个params char[],但正在运行 Console.WriteLine("DDN8057".TrimStart("DDN".ToCharArray())); 给了我我的期望 8057 因此,我想VB能够在内部将字符串视为字符数

我有最简单的VB代码:

Dim test As String = "DDN8057"
Console.WriteLine(test.TrimStart("DDN"))
给我

N8057

为什么??将其转换为C#(我更熟悉),使我意识到
TrimStart
实际上需要一个
params char[]
,但正在运行

Console.WriteLine("DDN8057".TrimStart("DDN".ToCharArray()));
给了我我的期望

8057


因此,我想VB能够在内部将字符串视为字符数组(这是真的吗?),但为什么我的输出中存在差异?

您的VB项目中没有打开Option Strict

我能说出来,因为启用此选项时,
test.TrimStart(“DDN”)
不会编译。这是因为正如您正确指出的
TrimStart
需要一个显式字符数组(或单个字符)

在关闭选项Strict的情况下运行此选项时,编译器会将
字符串(
DDN
)强制为单个字符(
D
)(这是选项Strict明确禁止的隐式缩小转换),这就是将
N8057
作为输出的原因

您可能会认为,由于字符串只是一个字符数组,它会将其转换为一个数组,但它不会-它有效地执行
CChar(“DDN”)

结论


选项严格开启=良好。下面是默认情况下如何打开它的方法:

使用
{“D”c,“D”c,“N”c}
“DDN”。VB中的ToCharray
提供了预期的输出。在需要字符数组时传递字符串将无法正常工作。它只取字符串的第一个字母,忽略其余字母。将第二个D替换为任何其他字符以检查此问题如果您打开Option Strict(并且应该始终打开它),则
test.TrimStart(“DDN”)
将不会编译,原因是您解释了BAH。我忘记了
选项严格
。虽然关闭了它,但VB让它在运行时运行似乎很激进。我认为
选项严格关闭
就像在C#中使用动态一样。但是基于
选项strict
docs,我猜字符串到字符的范围缩小了conversion@Jonesopolis-动态和选项严格之间存在细微但重要的区别。启用Strict时产生的错误是
BC30512
-