Существенная проблема здесь заключается в том, что VB не позволяет «голым» выражениям быть операторами. C# (и Java) ограничивает выражения как операторы следующим образом:
- Выражения присваивания
- Любое использование ++ или -
- Вызовы методов
- Выражения создания объекта
Что касается первых двух точек, VB имеет своего рода эквиваленты. VB не имеет встроенного выражения присваивания; вместо этого он имеет оператор присваивания. VB не имеет операторов ++
или --
; он имеет только операторы присваивания +=
и -=
. В любом случае, с помощью вспомогательных функций можно сделать их полностью эмулированные эквиваленты в VB.
Из вышеперечисленных пунктов в VB допускается только «вызов метода». «Выражения создания объекта» нет.
Итак, что-то вроде New MyForm()
является выражением, несмотря на притворство Sub New()
. Самый простой обходной путь - использовать локальные переменные (как уже предлагали другие):
Dim tmp As New MyForm(Text, caption, timeout)
Другая идея заключается в использовании With
:
With New MyForm(Text, caption, timeout) : End With
Если Вы полагаете, что это то, чем вы будете часто заниматься, может быть, вы могли бы добавить в свой класс закрытый или защищенный метод, который ничего не делает:
Private Sub NoOp()
End Sub
и использовать его следующим образом:
Call New MyForm(Text, caption, timeout).NoOp()
Это работает, потому что оператор Call
допускает выражения на пути к вызову метода.
В качестве альтернативы, вы можете сделать вспомогательную функцию в Module
, например, так:
#Disable Warning IDE0060 ' Remove unused parameter
Friend Sub [Call](Of T)(x As T)
#Enable Warning IDE0060 ' Remove unused parameter
End Sub
И затем сделайте это с ним:
[Call](New MyForm(Text, caption, timeout)) ' Note square brackets on [Call]