"Option Strict On" lässt Operanden des Typs "Object" für den =-Operator nicht zu.

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    "Option Strict On" lässt Operanden des Typs "Object" für den =-Operator nicht zu.

    Servus!

    Kann mir zu nachfolgendem Fehler jemand einen Tipp/Ansatz geben:
    "Option Strict On" lässt Operanden des Typs "Object" für den =-Operator nicht zu. Verwenden Sie den Is-Operator, wenn Sie die Objektidentität testen möchten.

    VB.NET-Quellcode

    1. For Each EntryFieldValue In EntryFieldValueList
    2. Select Case EntryFieldValue.FieldValues(7)
    3. Case 0 : Return True 'Fehler
    4. Case 1 : Return False 'Fehler
    5. End Select
    6. Next


    Vielen Dank!
    Was hat

    hate_regex schrieb:

    VB.NET-Quellcode

    1. EntryFieldValue.FieldValues(7)
    für einen Typ?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Was hat

    hate_regex schrieb:

    VB.NET-Quellcode

    1. EntryFieldValue.FieldValues(7)
    für einen Typ?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    hate_regex schrieb:

    String
    Probier es mal so:

    VB.NET-Quellcode

    1. Select Case EntryFieldValue.FieldValues(7).ToString
    2. Case "0" : Return True 'Fehler
    3. Case "1" : Return False 'Fehler
    4. End Select
    Oder Du konvertierst den Wert in einen Integer und lässt die 0 und die 1 stehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Danke, dass funktioniert.

    @ErfinderDesRades
    String! Definitiv :)

    Dumme Fragen immer zum Schluss:

    VB.NET-Quellcode

    1. Select Case EntryFieldValue.FieldValues(7).ToString
    2. Case "0" : Return True 'Fehler
    3. Case "1" : Return False 'Fehler
    4. End Select

    Ich versuche mich wirklich zu bemühen, die fiesen Option Strict Off Angewohnheiten abzulegen, und frage mich daher, ob die Kovertierung von Int.ToString nun wirklich 'sauberer' ist.
    In der Option Strict Off Variante hat der Compiler eben diese Entscheidung getroffen. Konkreter Vorteil?

    Die Konvertierung passt nun, nun habe ich noch das Problem, dass meine Function nicht in allen Pfaden einen Returnwert zurückgibt:

    VB.NET-Quellcode

    1. Function BMC_Unit(ByVal Unit As String) As Boolean
    2. Dim Qualification As String
    3. Dim EntryFieldList = New BMC.ARSystem.EntryListFieldList
    4. Dim EntryFieldValueList = New BMC.ARSystem.EntryFieldValueList
    5. Qualification = "'Unit' = """ + Unit + """"
    6. EntryFieldList.Clear()
    7. EntryFieldList.AddField(7) 'Status
    8. EntryFieldValueList = Server.GetListEntryWithFields("BMC-Unit", Qualification, EntryFieldList, 0, 0)
    9. If EntryFieldValueList.Count = 0 Then
    10. Return False
    11. Else
    12. For Each EntryFieldValue In EntryFieldValueList
    13. Select Case EntryFieldValue.FieldValues(7).ToString
    14. Case "0" : Return True
    15. Case "1" : Return False
    16. End Select
    17. Next
    18. End If
    19. End Function


    Ich könnte da ein Return Nothing einschieben, aber imho macht das keinen Sinn. Ebenfalls ein neues Problem für mich seit Strict On. Und vor allem: Warum wir da kein Wert zurückgegeben? Durch das If-Statement habe ich doch immer ein Returnwert?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hate_regex“ ()

    hate_regex schrieb:

    Durch das If-Statement habe ich doch immer ein Returnwert?
    Nö.
    Probier mal eine Konvertierung nach Integer:

    VB.NET-Quellcode

    1. Function BMC_Unit(ByVal Unit As String) As Boolean
    2. Dim Qualification As String
    3. Dim EntryFieldList = New BMC.ARSystem.EntryListFieldList
    4. Dim EntryFieldValueList = New BMC.ARSystem.EntryFieldValueList
    5. Qualification = "'Unit' = """ + Unit + """"
    6. EntryFieldList.Clear()
    7. EntryFieldList.AddField(7) 'Status
    8. EntryFieldValueList = Server.GetListEntryWithFields("BMC-Unit", Qualification, EntryFieldList, 0, 0)
    9. If EntryFieldValueList.Count = 0 Then
    10. Return False
    11. Else
    12. For Each EntryFieldValue In EntryFieldValueList
    13. Select Case CInt(EntryFieldValue.FieldValues(7)) ' hier CInt() statt ToString
    14. Case 0 : Return True
    15. Case 1 : Return False
    16. End Select
    17. Next
    18. End If
    19. Return False ' der hier, wenn oben eine '17' drin steht.
    20. End Function
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich glaube in EntryFieldValue.FieldValues(7) versteckt sich sowieso ein Boolean.
    Return Cbool(EntryFieldValue.FieldValues(7))...aber dann wäre die For-Schleife aber auch irgendwie umsonst...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    Merci. Wird nun CInt-Konvertiert. Funktioniert.
    Verständnisfrage: Innerhalb des If-Statements gibt es 2 Möglichkeiten: True/False. Für beide Fälle gebe ich einen Returnwert an.
    Warum muss nach der Schleife nochmal ein Returnwert zurückgegeben werden? Warum wird nicht kategorisch ein False damit zurückgegeben (in der Schleife ist ja keine Exit Anweisung)?
    So funktioniert es ja auch, ohne Returnwert nach der Schleife:

    VB.NET-Quellcode

    1. If EntryFieldValueList.Count = 0 Then
    2. Return False
    3. Else
    4. Return True
    5. End If

    Ich glaube in EntryFieldValue.FieldValues(7) versteckt sich sowieso ein Boolean.

    Return Cbool(EntryFieldValue.FieldValues(7))...aber dann wäre die For-Schleife aber auch irgendwie umsonnst...
    Hier ist es zwar letzlich Boolean, aber eher zufällig, weil es nur 0/1 Rückgabewerte gibt. Der Rückgabewert ist tatsächlich String.
    Da der Wert als "0", "1" zurückkommt, funktioniert leider die Cbool Auswertung nicht.

    hate_regex schrieb:

    VB.NET-Quellcode

    1. If EntryFieldValueList.Count = 0 Then
    2. Return False
    3. Else
    4. Return True
    5. End If
    Klar, hier sind ja auch alle Wege abgedeckt. Im Select Case-Fall gibt es einen, wenn auch nicht implementierten Case Else-Zweig.
    Und wenn schon, dann so:

    VB.NET-Quellcode

    1. Return EntryFieldValueList.Count <> 0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    hate_regex schrieb:

    Die Konvertierung passt nun, nun habe ich noch das Problem, dass meine Function nicht in allen Pfaden einen Returnwert zurückgibt:

    Die Meldung kommt deshalb, weil die For Schleife ja nicht zwingend durchgeführt wird (was wenn es keine Items in der Auflistung gibt?).

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    hate_regex schrieb:

    Hier ist es zwar letzlich Boolean, aber eher zufällig, weil es nur 0/1 Rückgabewerte gibt. Der Rückgabewert ist tatsächlich String.
    Da der Wert als "0", "1" zurückkommt, funktioniert leider die Cbool Auswertung nicht.

    VB.NET-Quellcode

    1. Return Cbool(CInt(EntryFieldValue.FieldValues(7)))
    ...wenn wirklich nur "0", "1" und sonst nichts anderes zurückgegeben wird.
    Aber dann ist die Frage - warum eine Schleife? (Vielleicht verstehe ich hier etwas falsch...)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    Jout, dass mit der Return-Anweisung habe ich nun verstanden, danke für die Aufklärung!

    VB.NET-Quellcode

    1. Return EntryFieldValueList.Count <> 0

    Da muss man erstmal drauf kommen! Vielen Dank, spart 3 Zeilen.
    Aber dann ist die Frage - warum eine Schleife? (Vielleicht verstehe ich hier etwas falsch...)

    Weil es mehr als einen Rückgabewert geben kann. Da sprichst du aber auch schon mein nächstes Problem an. Mehrere Rückgabewerte. Momentan gibt es das nicht (kann aber auftreten). Letztlich müsste der Rückgabewert eigentlich nicht Boolean sein, sondern ein Array. Habs aber nicht hinbekommen. Die Schleife ist noch aus dem Array-Versuch übrig geblieben und an dieser Stelle eigentlich unnötig.

    hate_regex schrieb:

    Mehrere Rückgabewerte. Momentan gibt es das nicht (kann aber auftreten).
    Wenn es mehrere Ergebnisse geben kann, dann muss man wie bei Select Case vorgehen...

    hate_regex schrieb:

    Letztlich müsste der Rückgabewert eigentlich nicht Boolean sein, sondern ein Array.
    Da meinst du wohl so etwas: Dim Objekte() As Object = {True, False, 1, 0, "Text", 3.14}