【问题标题】:Apply method to literal将方法应用于文字
【发布时间】:2021-02-09 10:24:02
【问题描述】:

我熟悉 C#,但完全不熟悉 VB,我想将 C# 示例(在 LINQPad 中)转换为 VB:

if (2 + 2 == 4)
    "True".Dump();

我想出了以下工作 VB 代码:

Dim word = "True"
If 2 + 2 = 4 Then
    word.Dump
End If

现在,为什么我不能只写以下内容呢?

If 2 + 2 = 4 Then
    "True".Dump  ' BC30035 Syntax error
End If

似乎我无法在 VB 中将方法应用于 litteral,我必须先将其存储在变量中, 但我肯定在这里遗漏了一些东西......不是吗?

附:字符串周围的括号不能更好地工作。

【问题讨论】:

  • 我不使用 LinqPad,但您绝对可以在 Visual Studio 中使用。
  • @jmcilhinney 你确定吗?我可以使它与CStr("True").Dump() 一起工作,但不能与"True".Dump() 中的普通文字一起工作。类似地,对于整数的扩展方法,CInt(2).Foo() 可以工作,但 2.Foo() 想要将 2 视为行号并抱怨它需要后跟冒号。
  • @AndrewMorton IIRC 如果你使用Call,你可以。
  • @KonradRudolph jmcilhinney 在他的answer 中提到了这一点。我只是在查看 VB.NET 语言规范,如果其他人感兴趣,它看起来像 Statements 部分涵盖了它:“Microsoft Visual Basic 编译器只允许以关键字或标识符开头的语句。”

标签: vb.net linqpad


【解决方案1】:

问题不在于您不能在文字上调用方法。问题是您不能以文字开始一行代码,就像您不能以 New 关键字开始一行代码一样。如果你这样做:

Dim x = "Hello".Split("l"c)
Dim y = 2.ToString()

它可以正常工作。如果你这样做:

"Hello".Split("l"c)
2.ToString()

您会遇到两个错误,在这两种情况下,将鼠标悬停在问题上都会告诉您:

只有成员访问表达式才能启动调用语句。

就像你想用构造函数开始一行一样,你可以使用Call 关键字来有效地做你想做的事:

Call "Hello".Split("l"c)
Call 2.ToString()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多