Entwickler-Ecke

Sonstiges (.NET) - Wie kann ich in VB den Elvis / Ternary Operator nutzen?


lapadula - Fr 24.06.22 10:03
Titel: Wie kann ich in VB den Elvis / Ternary Operator nutzen?
Wie kann ich in VB den Elvis / Ternary Operator nutzen?

Hallo ich habe eine alte ASP.NET Anwendung, wo ich den Ternary Operator in der Code-Behind nutzen möchte.
Leider bekomme ich beim Aufruf der Page eine Fehlermeldung, die besagt, dass ich "?" nicht nutzen darf (Error: "? cannot be used here").

Ich habe dann irgendwo gelesen, dass ich Roslyn und Microsoft.CodeDom.Providers.DotNetCompilerPlatform installieren soll, müsste das vb nicht schon längst unterstützen.

Ich möchte das gleiche was typescript kann: TypeScript 3.7: Optional Chaining [https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html]

Also Dim stringValue = If(Object?.name?.name1, "")

Moderiert von user profile iconTh69: Code-Tags hinzugefügt
Moderiert von user profile iconTh69: URL-Titel hinzugefügt


Ralf Jansen - Fr 24.06.22 10:25

Laut Doku so: ?. und ?() nullbedingte Operatoren (Visual Basic) [https://docs.microsoft.com/de-de/dotnet/visual-basic/language-reference/operators/null-conditional-operators].

Was das jetzt mit dem ternary Operator oder dem Iff (den meinst du, nicht if, oder?) hab ich nicht verstanden.

Es sollte einfach Dim stringValue = Object?.name?.name1 sein.

Wobei dein Beispielnaming mich verwirrt. Ein Property name an etwas das Object heißt die eine Property name1 hat? Mag nur ein Beispiel sein klingt aber falsch.

Moderiert von user profile iconTh69: URL-Titel hinzugefügt
Moderiert von user profile iconTh69: Code-Tags hinzugefügt


Th69 - Fr 24.06.22 10:36

Verwendest du noch eine ältere VB.NET-Version? Denn laut Null conditional operator [https://riptutorial.com/vb-net/example/4878/null-conditional-operator] kam dies ab Version 14 [https://de.wikipedia.org/wiki/Visual_Basic_.NET#2010%E2%80%932019:_Visual_Basic_10_bis_16] (d.h. mit Visual Studio 2015) hinzu.
Ansonsten klassisch:

VB.NET
1:
If Object IsNot Nothing AndAlso Object.Name IsNot Nothing Then                    


lapadula - Fr 24.06.22 10:43

Hallo, das ist ein Webservice den ich nutze, ich hab davon automatisch Klassen anlegen lassen über "add Service Reference".

Das Ding heißt nicht Object, sondern Person ^^

Ich wusste nicht die genaue Bezeichnung. In der Doku steht aber nicht, ab wann es verfügbar ist oder bin ich blind.
Ich bin vor kurzem umgestiegen von Visual Studio 2015 auf 2022, habe auch schon probiert die Framework-Version zu erhöhen, momentan ist das die 4.5.1

Leider bringt das alles nichts, es gibt trotzdem noch die Meldung:
Zitat:
Kompilierungsfehler
Beschreibung: Fehler bei der Kompilierung einer Ressource, die zur Verarbeitung dieser Anforderung erforderlich ist. Überprüfen Sie die folgenden spezifischen Fehlerdetails, und ändern Sie den Quellcode entsprechend.

Zitat:
Compilerfehlermeldung
BC36637: An dieser Stelle darf das Zeichen "?" nicht verwendet werden.

Ich möchte das Prüfen jeder einzelnen Property per IsNot Nothing verhindern, weil das doch unübersichtlich wird.

Moderiert von user profile iconTh69: Code-Tags hinzugefügt


Th69 - Fr 24.06.22 10:47

Schau mal in die zugehörige ".vbproj"-Datei: Select the Visual Basic language version [https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/configure-language-version]


lapadula - Fr 24.06.22 11:02

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Schau mal in die zugehörige ".vbproj"-Datei: Select the Visual Basic language version [https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/configure-language-version]

Ich habe keine .vbproj Datei, weil das eine Webanwendung ist, mit web.config.
In dem Fall müsste ich ja Compiler per NuGet laden, oder (Microsoft.CodeDom.Providers.DotNetCompilerPlatform)


Th69 - Fr 24.06.22 11:49

Achso, ja - dann mittels "web.config" und den NuGet-Packages: How can I use the latest VB.NET language level in an ASP.NET web site project? [https://stackoverflow.com/questions/49071549/how-can-i-use-the-latest-vb-net-language-level-in-an-asp-net-web-site-project]


Ralf Jansen - Fr 24.06.22 11:53

So ein Projekt wo man den Sourcecode deployed und erst on the-fly auf dem WebServer compiliert wird ?
Da konnte man die Sprachen mischen. Schreib einfach die Klassen die häßlich sind von VB in C# um. Der Server kompiliert das schon passend :D


lapadula - Fr 24.06.22 12:27

Ich bekomme nach der Installation der Packages nun beim Start folgende Meldung:

Quelltext
1:
BC2014: the value 'default' is invalid for option 'langversion'                    


Lieft wohl an dem Eintrag für vb langversion:default, wenn ich da 6 Eintrage, dann meckert der, dass 6 ungültig sei.

Quelltext
1:
2:
3:
4:
5:
6:
<system.codedom>
    <compilers>
      <compiler extension=".cs" language="c#;cs;csharp" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701;612;618" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      <compiler extension=".vb" language="vb;vbs;visualbasic;vbscript" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008,40000,40008 /define:_MYTYPE=\"Web\" /optionInfer+" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </compilers>
 </system.codedom>


Th69 - Fr 24.06.22 13:11

Hast du schon 15.0 oder latest probiert (wie in dem von mir verlinkten SO-Thema)?


lapadula - Fr 24.06.22 13:21

Ja, der meldet dann, dass die 15 ungültig ist...


Ralf Jansen - Fr 24.06.22 13:40

Hmh. Das er 6 nicht will ist verständlich aber 15 sollte gehen. Siehe /langversion [https://docs.microsoft.com/de-de/dotnet/visual-basic/reference/command-line-compiler/langversion]
Möglicherweise ist langversion:latest eine Option.

Welcher Compiler liegt den da rum wo tatsächlich kompiliert wird? Hab leider vergessen wie das genau funktioniert :( Dort sollte vermutlich das passende SDK existieren und über den Pfad gefunden werden müssen damit die nötigen Versionen auch bekannt sind. Wenn da der alte Compiler von der ursprünglichen Entwicklung gefunden wird sind alle späteren Version vermutlich unbekannt. Dann sollte zwar latest gehen aber ist dann vermutlich immer noch eine zu alte Version.

Moderiert von user profile iconTh69: URL-Titel hinzugefügt
Moderiert von user profile iconTh69: Code-Tags hinzugefügt


lapadula - Fr 24.06.22 13:58

Konnte das in der developer console folgendermaßen ermitteln:

Quelltext
1:
csc -langversion:?                    


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Unterstützte Sprachversionen:
default
1
2
3
4
5
6
7.0
7.1
7.2
7.3
8.0
9.0
10.0 (default)
latestmajor
preview
latest

Obwohl da default und latest unterstützt wird hat er jetzt nur "10" akzeptiert.
Ich denke ich werde es doch nicht tun, weil wir auch noch Selbsthoster haben und ich kann die Probleme schon riechen.
Habe jetzt alles mit NotIs Nothing zugekleistert.

Trotzdem danke für die Hilfe, ich werde nochmal reinschauen wie es geht, wenn ich das beim nächsten Mal probiere :D

Moderiert von user profile iconTh69: Code-Tags hinzugefügt


Th69 - Fr 24.06.22 14:03

Das ist ja auch der C#-Compiler (csc)!
Du mußt "vbc" aufrufen...


lapadula - Fr 24.06.22 14:21

Stimmt, folgendes kommt dabei raus:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Unterstützte Sprachversionen:
default
9
10
11
12
14
15
15.3
15.5
16
16.9 (default)
latest


15 wollte er aber nicht...