Skip to content

Diagnostics de

Edgar Mesquita edited this page Oct 14, 2026 · 1 revision

Diagnosen

🌐 Diese Seite auf: English · Português · Español · Français · Deutsch

Jeder Build-Fehler und jede Warnung, die eqc ausgeben kann, mit ihrer Bedeutung und dem, was zu tun ist. Die Codes sind stabil: nach ihnen sucht man, und sie würde eine Unterdrückung benennen.

Diese Seite wird aus derselben Referenz erzeugt, die das Repository prüft: docs/DIAGNOSTICS.md, gegen den Compiler gehalten von DiagnosticsDocumentedTests. Ein Code, den der Compiler erhebt, oder den die MSBuild-Targets des SDK selbst erheben, ohne Zeile hier bricht den Build, ebenso wie eine Zeile, die einen Code benennt, der nicht mehr existiert, und ebenso ein Code, der eine neue Meldestelle gewinnt, was keine Stilregel ist: EQ2101 waren einmal zwei unverwandte Fehler (eine Abweichung einer resx-Übersetzung und System.IO in einer Client-Komponente), jeder von seinem eigenen grünen Test festgenagelt, weil die beiden sich nie in einer Kompilierung trafen.

Diagnosen werden in MSBuilds kanonischer Form ausgegeben, sodass die IDE und dotnet build sie beide verlinken:

Pages/Counter.cs(14,9): error EQ2002: C# 'goto' cannot be transpiled to JavaScript …

EQ0xxx: der Build-Host

Der eqc-Prozess selbst, vor oder um eine Kompilierung herum.

Code Bedeutung Was zu tun ist
EQ0000 Ein Kompilierungsfehler kam ohne eigenen Code an. Lies die Meldung: der Code fehlt, nicht die Diagnose.
EQ0001 eqc ist abgestürzt. Ein Fehler im Compiler. Die Meldung trägt die Ausnahme; bitte melde ihn mit der Quelle, die ihn ausgelöst hat. Ein Fall ist nicht der des Compilers: die Projekte, die die App referenziert, konnten nicht aus ihrer Quelle gelesen werden, weil die Liste, die das SDK für den Build geschrieben hat, nicht da ist oder kein Projekt enthält, oder weil eine Assembly oder ein Projekt, das sie benennt, nicht da ist. Die Meldung benennt, was nicht hielt, und der Build hört dort auf, denn weiterzugehen würde eine Seite schreiben, die Typen benennt, die nichts importiert (Seit 0.2.0-preview.62). Baue erneut, und melde es, wenn es bleibt.
EQ0002 Die MSBuild-Referenzliste ist leer, also würde das semantische Modell aus einer unvollständigen Kompilierung gebaut und benannte Argumente könnten in der falschen Reihenfolge ausgegeben werden. Baue neu (dotnet build). Wenn es bleibt, lief CompileEQuanticUI ohne FindReferenceAssembliesForReferences.

EQ1xxx: es existiert noch keine Übersetzung

Eine Lücke im Compiler, nicht in deinem Code. Das Konstrukt ist legales C# und könnte übersetzt werden; heute tut es nichts. Das sind die Codes, die schrumpfen, während der Compiler wächst.

Code Bedeutung Was zu tun ist
EQ1001 Eine C#-Ausdrucksart hat keine Transpilierungsstrategie. Schreibe sie in eine transpilierbare Form um, oder füge eine Konvertierungsstrategie für das Konstrukt hinzu.
EQ1002 Eine C#-Anweisungsart hat keine Transpilierungsstrategie. Wie oben.
EQ1003 Ein C#-Knoten (weder Ausdruck noch Anweisung) hat keine Strategie. Wie oben.
EQ1004 Eine Strategie passte auf das Konstrukt, aber genau diese Form hat keine Ausgabe: die Übersetzung wäre stillschweigend falsch, also hört es auf. Schreibe die Form um, oder füge der Strategie den fehlenden Fall hinzu.
EQ1005 Zwei Typen teilen einen Zwillingsdateinamen: entweder derselbe Name zweimal, oder zwei Namen, die sich nur in der Groß- und Kleinschreibung unterscheiden (eine Datei unter Windows und macOS). Ihre Zwillinge wären EINE Datei und die zweite würde die erste überschreiben. Benenne einen der Typen um.
EQ1006 (Warnung) Ein Typ ist an mehr als einer Stelle deklariert und eqc gibt ein Modul pro Deklaration aus, also enthält der Zwilling nur die Mitglieder der ersten Deklaration. Fasse sie zu einer einzigen Deklaration zusammen, oder halte die Mitglieder, die eine Komponente gemeinsam nutzt, in einer. Harmlos, wenn die anderen Hälften nur auf dem Server leben, und darum hält es den Build nicht an.
EQ1007 Ein Methodenname zweimal in einem Typ deklariert: zwei Überladungen, oder zwei Namen, die sich auf einen senken (Foo und foo). C# unterscheidet Überladungen an ihren Parametern, und eine JavaScript-Klasse hat ein Mitglied pro Name, also würde der Zwilling eine davon behalten und jeder Aufruf würde sie erreichen: eine Klasse, ein Record oder eine statische Klasse behielt die LETZTE, eine Komponente die ERSTE, alles im Stillen. Eine statische und eine Instanzmethode dürfen einen Namen teilen, die zwei Hälften einer partiellen Methode sind eine Methode, und eine explizite Schnittstellenimplementierung nimmt den Namen der Schnittstelle, den keine Umbenennung ändern kann, also lässt die Überladungsprüfung sie aus; neben einem Default einer anderen Schnittstelle nimmt sie den Namen ihres Mitglieds wie jedes Mitglied, und wird geprüft. Zwei Defaults, die eine Klasse aus verschiedenen Schnittstellen nimmt, oder ein Default und ein Mitglied, das die Klasse deklariert, landen auf dieselbe Weise auf einem Namen, und ebenso dieselben Paare entlang der Klassenkette: ein Mitglied, das eine abgeleitete Klasse auf dem Namen eines Defaults deklariert, den ihre Basis nimmt (es sei denn, sie implementiert das Schnittstellenmitglied dieses Defaults, indem die Klasse die Schnittstelle erneut aufführt), ein Default auf dem Namen eines Mitglieds, das eine Basis deklariert, und zwei Defaults verschiedener Schnittstellenmitglieder, eines von einer Basis und eines von der abgeleiteten Klasse genommen. Ein Indexer nimmt zwei Namen auf seinem Zwilling, item für seinen Getter und setItem für seinen Setter, also landet ein zweiter Indexer, oder jedes Mitglied, das der Zwilling unter diesen Namen hält (eine Methode, ein Feld, eine Eigenschaft, ein Ereignis, ein Parameter eines primären Konstruktors, den ein Mitglied liest), auf demselben Mitglied, und die Meldung benennt, was umzubenennen ist. Eine explizite Implementierung des Indexers einer Schnittstelle hält item und setItem, die jeder Zugriff über die Schnittstelle erreicht, und der eigene Indexer des Typs daneben nimmt eigene Namen; was ein Zugriff über eine Schnittstelle nicht unterscheiden kann, zwei explizite Implementierungen oder eine neben einem Indexer oder einem Default, der einer anderen Schnittstelle antwortet, wird abgelehnt. Instanzmitglieder eines Records oder eines Structs, die auf einem Namen landen, werden ebenfalls abgelehnt: ihr Zwilling hält den Zustand jeder Instanz als eigene Eigenschaften und ihre Methoden und berechneten Eigenschaften auf ihrem Prototyp, also teilten zwei von ihnen einen Platz (struct S(int x) { public int X { get; } = x * 2; } antwortete `6 6für3
EQ1008 Eine Klasse stützt sich auf ein Standard-Schnittstellenmitglied einer Schnittstelle, die in eine referenzierte Assembly außerhalb des SDK kompiliert ist. JavaScript hat keine Schnittstellen, also schreibt eqc jeden Default, den eine Klasse nimmt, in ihren Zwilling: aus der Quelle der Schnittstelle konvertiert, wenn die Kompilierung sie hat, und an die Kopie der Laufzeit delegiert für die SDK-eigenen Schnittstellen (IAppTheme, ICodeLanguage, ICodeCompletionProvider), die öffentlichen Schnittstellen der Assemblys, die die Laufzeit bereitstellt. Die Schnittstelle jeder anderen Assembly hat keines von beidem, welchen Namensraum sie auch deklariert, also hat der Zwilling kein solches Mitglied und ein Aufruf darauf im Browser träfe undefined. Dasselbe für einen Default, der ein statisches Mitglied einer Schnittstelle verwendet, das keine JavaScript-Form hat, die es hält. Deklariere das Mitglied in der Klasse, oder halte die Klasse aus dem Client-Code heraus.
EQ1009 Ein Konstruktor eines Records, eines Structs oder einer einfachen Klasse, den sein Zwilling nicht erreichen kann (der einer einfachen Klasse Seit 0.2.0-preview.61). Eine JavaScript-Klasse hat einen Konstruktor, also nimmt ihr Zwilling einen Zweig pro C#-Konstruktor danach, wie viele Argumente ankamen, die optionalen Parameter mitgezählt: jeder Konstruktor, der seine eigene Arbeit tut (der primäre, oder ein expliziter, der nicht mit : this(…) verkettet), bindet seine Parameter, setzt die Mitglieder, ruft den Konstruktor seiner Basis auf und führt seinen Körper aus, und jeder, der verkettet, führt den aus, zu dem er verkettet, nachdem er die Argumente der Kette ausgewertet hat. Ein Konstruktor, der eine Zahl von Argumenten nimmt, die ein anderer auch nimmt, kann von ihm nicht unterschieden werden, und einer, der zu einem Konstruktor verkettet, der seinerseits verkettet, oder : this() zum impliziten Konstruktor eines Structs neben eigenen Konstruktoren, erreicht seine Arbeit durch nichts. Der Kopierkonstruktor eines Records (protected R(R original)) ist kein Zweig: new erreicht ihn nie (Seit 0.2.0-preview.61). Ebenso wenig der Konstruktor, den nur .NETs Serialisierungen aufrufen, (SerializationInfo, StreamingContext), den Visual Studios Ausnahmevorlage neben (string, Exception) schreibt: der Browser hat kein SerializationInfo, und eine Ausnahmeklasse der App ist eine Klasse, deren Konstruktoren wie die jeder Klasse geprüft werden (Seit 0.2.0-preview.61). Ein Aufruf eines solchen, den der Browser machen würde, ein new, oder die : base(…)-, : this(…)- oder Basisklausel eines Konstruktors, den der Zwilling schreibt, wird abgelehnt, da der Aufruf ohne Zweig dafür einen anderen Konstruktor mit zwei Argumenten ausführen würde (new Snap(info, context) führte Snap(string, string) aus); der der Vorlage ruft den seiner Basis auf, ist kein Zweig und macht keinen Aufruf (Seit 0.2.0-preview.61). Gib dem Konstruktor eine eigene Zahl von Argumenten, oder verkette ihn zu einem, der seine eigene Arbeit tut. Eine statische Fabrik (static Coded FromText(string text) => new(text.Length)) sagt dasselbe ohne einen zweiten Konstruktor. Baue ein Objekt, dessen Serialisierungskonstruktor ein Aufruf durch einen anderen seiner Konstruktoren erreicht.

EQ2001–EQ2014: das Konstrukt kann nicht hinüber

Keine Lücke: es gibt kein Browser-Äquivalent, oder eine Übersetzung müsste eine Vermutung sein. Diese schrumpfen nicht mit der Arbeit am Compiler: sie sind die Form des Ziels.

Code Bedeutung Was zu tun ist
EQ2001 Ein C#-Konstrukt ohne Laufzeitäquivalent im Browser (Intrinsics für typisierte Referenzen: __makeref, __reftype, __refvalue, stackalloc, Zeiger). Baue es ohne um.
EQ2002 goto. Baue mit Schleifen und Bedingungen um, oder mit einem beschrifteten break/continue (die werden ÜBERSETZT).
EQ2003 new T() auf einem Typparameter: generische Argumente werden in JavaScript zur Laufzeit gelöscht, also ist der konkrete Typ unbekannt. Übergib eine Fabrik (Func<T>) oder den fertig gebauten Wert.
EQ2004 Ein Mitglied ohne JavaScript-Übersetzung: eine Erweiterungsmethode, deren deklarierende Klasse nicht Teil dieser Kompilierung ist, oder ein Aufruf, für den der Transpiler nichts abbildet (Stopwatch.StartNew, Roslyn…) innerhalb einer Klasse, die er spiegelt, qualifiziert geschrieben oder bloß über using static erreicht (WriteLine unter using static System.Console, seit 0.2.0-preview.60). Auch ein System.Range-Wert, der gespeichert statt zum Indizieren verwendet wird, oder einem Indexer übergeben, der den Range selbst nimmt (this[Range r], seit 0.2.0-preview.61). Verwende ein Instanzmitglied oder bringe die deklarierende Quelle herein; füge eine Strategie hinzu; für einen Bereich indiziere direkt damit (text[a..b]), oder gib dem Typ ein Length (oder ein Count) und ein Slice(int start, int length), das ein Bereich aufruft; verlege den Aufruf hinter ein [ServerAction]; oder markiere, wenn die ganze Klasse nur auf dem Server läuft, die KLASSE als [ServerOnly], und es wird kein Modul für sie ausgegeben (0.2.0-preview.46).
EQ2005 Ein unendlicher Iterator. Iteratoren werden in ein Array MATERIALISIERT, also würde die Schleife für immer laufen, statt faul zu liefern. Gib der Schleife ein Ende (eine Grenze, ein yield break), oder nimm innerhalb der Methode, was du brauchst.
EQ2006 Das Mitglied bindet nicht im semantischen Modell, also wäre jede Übersetzung eine Vermutung. Entweder kompiliert der Code nicht, oder eqc fehlen Referenzen oder generierte Quellen. Niemals geraten: siehe Compiler.
EQ2007 Ein Vergleicher, der ändert, was eine Sammlung als gleich oder in Ordnung ansieht: das with(…)-Argument eines Sammlungsausdrucks über einen Kapazitätshinweis hinaus, oder ein Vergleicher, der dem Konstruktor einer Sammlung übergeben wird (new Dictionary<string, T>(StringComparer.OrdinalIgnoreCase)) oder einem LINQ-Operator, der seine Schlüssel oder seine Elemente danach findet (ToHashSet, und ToDictionary, ToLookup, GroupBy und Distinct seit 0.2.0-preview.61). Eine Liste, eine Menge oder ein Wörterbuch findet ein Element über die Standardgleichheit seines Typs und nimmt keine andere: die Standardvergleicher und StringComparer.Ordinal gehen durch. Ein Sortieren oder eine binäre Suche nimmt den Standardvergleicher des Typs, ein Comparison<T>, die sechs eines StringComparer, Comparer<T>.Create und einen Vergleicher, den du schreibst, und lehnt nur einen ab, den kein Zwilling trägt (ein StringComparer für eine Kultur, ein Vergleicher, den eine Bibliothek kompiliert hat). Lass den Vergleicher weg, oder normalisiere die Schlüssel selbst (setze sie beim Hereinkommen und bei jeder Suche in Kleinbuchstaben). Für ein Sortieren übergib ein Comparison<T>.
EQ2008 Abfragesyntax mit join, let, einem zweiten from oder into: ihre C#-Übersetzung läuft über vom Compiler erzeugte transparente Bezeichner. Auch die eingefassten Initialisiererformen. Schreibe in Methodensyntax um, wo jeder Operator unterstützt wird.
EQ2009 Eine Komponente ist in einer Datei mehr als einmal deklariert (partielle Deklarationen). eqc gibt ein Modul pro Deklaration aus und kann sie nicht zusammenführen. Fasse die Mitglieder zu einer einzigen Deklaration zusammen.
EQ2010 Ein Symbol, das das Framework auf dem HOST hält, ein Typ oder ein einzelnes Mitglied mit [ServerOnly] markiert, von Client-Code benannt. Die Laufzeit liefert keinen Zwilling, also würde die Referenz kompilieren, ausgeben und bei der Hydration an „does not provide an export named“ scheitern, während SSR weiter 200 antwortete. Eine Erweiterungsmethode, die auf einem Wert aufgerufen wird, der hinübergeht, benennt auch ihr Zuhause: curve.Ease(t) ist CurveEvaluator.Ease(curve, t), und es scheiterte am Aufruf. Ein Typ, der in einem deklariert ist, der nie hinübergeht (eine [ServerOnly]-Klasse oder ein Attribut), hat ebenfalls keinen Zwilling, wie sein Besitzer keinen hat, während einer, der in einer Ausnahmeklasse der App deklariert ist, hinübergeht, wie diese Klasse es tut, also wird Client-Code, der ihn erreicht, auf dieselbe Weise abgelehnt, wie auch immer er ihn erreicht: über seinen Namen, einen Alias, using static, einen Operator oder eine Konvertierung, die sein Wert mitbringt, oder eine Null. Ein Modul, das seinen Zwilling importieren würde, meldet ihn an der Deklaration, die die Referenz enthält (Seit 0.2.0-preview.61). Ein mit [ServerOnly] markiertes Mitglied wird überall abgelehnt, wo Client-Code es benennt, einschließlich des Codes seines eigenen Typs: eine Komponente lässt eine solche Methode aus ihrem Zwilling, und ihr eigenes Build, das sie aufrief, war ein Aufruf eines Mitglieds, das der Zwilling nicht hat (Seit 0.2.0-preview.62). Rufe es von Server-Code aus auf: einem [ServerAction], einer [ServerOnly]-Klasse oder einem Realisierer. Niemals aus dem Build einer Komponente. Anders als bei EQ2004 ist dies eine ENTSCHEIDUNG, keine Lücke: eine Strategie hinzuzufügen ist nicht die Antwort.
EQ2011 Ein Mitglied, das einen Namen nehmen würde, den die Komponente der Laufzeit schon verwendet. C# hält einen Parameter eines primären Konstruktors, ein Feld und eine Eigenschaft auseinander und schreibt sie anders als das camelCase der Laufzeit; JavaScript faltet all das auf this.<name>, also ersetzt die Zuweisung das Mitglied der Laufzeit und die Seite scheitert nur im Browser. Die Liste wird aus der lebenden Laufzeit gelesen, niemals getippt. Benenne das Mitglied um. Ein override ist ausgenommen: das Build einer Komponente soll das build der Laufzeit ersetzen, und ein Basismitglied zu ersetzen ist, wofür eines da ist, eine einfache Methode aber nicht: public void Mount() { } überschreibt nichts und gibt dennoch mount() über das eigene der Laufzeit aus, also wird die Komponente nie montiert.
EQ2012 Ein [ServerAction] auf einer ABSTRAKTEN Komponente. Der Server registriert eine Aktion unter dem Namen der KONKRETEN Komponente, die sie trägt, er überspringt abstrakte Typen und geht geerbte Methoden ab, also bedient er Tile/Load, während ein auf der Basis ausgegebener Stub CardBase/Load aufrufen würde. Nichts bedient diese ID und die Seite bekommt „action not found“, auf beiden Seiten im Stillen. Deklariere die Aktion auf der konkreten Komponente. Ein Alias ist nicht die Antwort: der Deskriptor trägt den Komponenten-TYP, auf dem aufzurufen ist, also geben zwei Kinder, die eine Aktion erben, der ID der Basis zwei Antworten; der Besitzer einer geerbten Aktion ist eine Entscheidung, kein Flicken.
EQ2013 Ein Vokabulartyp, dessen Browser-Hälfte die Werte eines Typarguments wiederbelebt (ServerTopic<T>), wird dort gebaut, wo dieses Argument ein Typparameter ist oder einen enthält, wie in static ServerTopic<T> Topic<T>(string name) => new(name). JavaScript löscht den Typ dort, also würde das Topic keine Spezifikation tragen und jede Nutzlast ihre Abonnenten unwiederbelebt erreichen: ein decimal oder ein long als der Text, den die Leitung schreibt, ein Record ohne seine Mitglieder. Baue das Topic dort, wo sein Nutzlasttyp konkret ist, als statisches Mitglied des Typs, der die Topics der App deklariert: static ServerTopic<RoomEvent> Room(string id) => new($"room:{id}"). Siehe Server-Ereignisse.
EQ2014 Ein Ausnahmetyp wird dort gebaut oder geprüft, wo ein Typargument, das er trägt, sein eigenes oder eines eines Typs, in dem er verschachtelt ist, ein Typparameter ist oder einen enthält, wie in static Exception Of<T>() => new Failed<T>(), catch (Failed<T>) oder new Missing() innerhalb der generischen Klasse, die ihn deklariert. Eine Ausnahme trägt die Typen, die sie ist, die ein typisiertes catch, ein is und ihr Name lesen, und JavaScript löscht einen Typparameter, also würde die Ausnahme T selbst tragen oder die Prüfung ihn vergleichen: catch (Failed<int>) verpasste, was Of<int>() warf (Seit 0.2.0-preview.61). Baue und prüfe eine Ausnahme dort, wo ihre Typargumente konkrete Typen sind, und deklariere eine Ausnahmeklasse außerhalb eines generischen Typs.

EQ2100–EQ2101: resx-Vorlagen

Der Lokalisierungsvertrag, auf der Build-Maschine geprüft und nicht erst, wenn ein Besucher kommt.

Code Bedeutung Was zu tun ist
EQ2100 Über diesen Aufruf: die Vorlage muss ein gültiges zusammengesetztes Format sein, dessen Spezifizierer innerhalb der unterstützten Teilmenge liegen, und der Aufruf muss jede Lücke übergeben, die sie deklariert. Korrigiere die Argumentzahl, oder lass den Spezifizierer außerhalb der Teilmenge weg (eine Ausrichtung wie {0,10} liegt außerhalb von v1).
EQ2101 Über die Übersetzungen: das resx jeder Kultur wird gegen das neutrale gehalten, das der Aritätsvertrag ist. Korrigiere die Vorlage der Kultur: ein fehlendes oder überzähliges {n} bricht den Build, nicht die Seite.

EQ2102–EQ2107, EQ2112, EQ2114: die Client-Server-Grenze

Eine Client-Komponente griff nach einer API, die nur auf einem Server existiert, oder nach einem Wert, den nur der Server hat. Die Brücke ist [ServerAction].

Code Bedeutung
EQ2102 Direkter Datenbankzugriff (Microsoft.EntityFrameworkCore, System.Data).
EQ2103 Netzwerk (System.Net.Http, System.Net.Sockets).
EQ2104 Betriebssystem-Threads und -Sperren (Thread, Monitor, Mutex, Semaphore, nicht Task).
EQ2105 Prozesse starten (System.Diagnostics.Process).
EQ2106 Native Interoperabilität / P-Invoke (System.Runtime.InteropServices).
EQ2107 IL-Erzeugung zur Laufzeit (System.Reflection.Emit).
EQ2112 Dateisystemzugriff (System.IO).
EQ2114 Eine Seite verwendet einen Wert, den der Container des Servers ihr gegeben hat (einen Konstruktorparameter eines Klassentyps, oder ein Mitglied, in dem die Seite einen hält), auf eine Weise, der der Build nicht folgen kann: eine darauf aufgerufene Methode, der Wert dorthin übergeben, wo der Build keine Quelle hat, in Text umgewandelt, verglichen, aufgezählt, in einer Sammlung gespeichert, über ein Mitglied gelesen, das ein .NET-Typ auf einem Wert deklariert, der nicht ganz hinübergeht (das Count einer Liste oder einer Menge von Objekten, das Value eines Paares), über einen Typ gelesen, dessen Mitglied dieses Namens der eigene Typ des Wertes verdeckt (new), oder gelesen, während die Seite konstruiert wird. Ein solcher Wert geht nur als das, was der Browser von ihm liest, in den Browser hinüber, also würde eine Verwendung, die der Build nicht sehen kann, dort etwas anderes zeichnen. Vom Quellgenerator gemeldet, also zeigt es sich im Editor. Entscheide auf dem Server, in PrefetchAsync oder einem [ServerOnly]-Mitglied, und halte das Ergebnis in einem Feld; oder rufe ein [ServerAction] auf, wenn der Zustand des Browsers eine Eingabe ist.

EQ2114 kam in 0.2.0-preview.60, als ein Dienst, den der Container einer Seite übergibt, aufhörte, ganz hinüberzugehen (siehe Server-Integration).

EQ2112 steht mit Absicht abseits seiner Familie: System.IO wurde als EQ2101 gemeldet, bis sich dieser Code als zur resx-Prüfung oben gehörend erwies, die das Wiki schon veröffentlicht hatte. Es ist kein Nummerierungsfehler, den man zurückräumt.

EQ2108–EQ2111: eine Bedeutung pro Ziel, oder keine

Das Konstrukt wird übersetzt, würde sich aber auf dem Server und im Browser anders LESEN. Statt für dich zu wählen, fragt eqc.

Code Bedeutung Was zu tun ist
EQ2108 Ein CultureInfo, dem der Browser nicht folgen kann: das Formatieren geht mit InvariantCulture und CurrentCulture hinüber, und das Lesen einer Zahl (Parse/TryParse auf jedem numerischen Typ, Convert.ToInt32 und seine Geschwister auf einer Zeichenkette, Convert.ToDecimal auf einer Zeichenkette oder auf einem Wert, der eine halten kann, etwa einem object) nur mit InvariantCulture. Convert.ToBoolean befragt seinen Anbieter nie, aber C# wertet ihn aus, also geht es mit InvariantCulture, CurrentCulture und einem Null hinüber, die wirkungslose Lesevorgänge sind, und mit jedem anderen Anbieter, den eine App schreibt, während ein anderes CultureInfo (GetCultureInfo(name), new CultureInfo(name)), das werfen kann, keinen Zwilling hat, der es auswertet. Die Kultur ist die Eigenschaft, an die der Anbieter bindet, wie auch immer sie geschrieben ist: ein Mitglied eines anderen Typs, das ebenfalls InvariantCulture heißt, wird abgelehnt, da es jede Kultur zurückgeben kann. Formatiere mit einem ausdrücklichen Spezifizierer (ToString("N2") folgt der Kultur der App auf beiden Zielen), oder konvertiere und lies mit der invarianten Kultur.
EQ2110 Eine Zahl, die ohne jede Kultur aus Text gelesen wird (oder aus einem Wert, der Text halten kann, etwa einem object): C# liest in der Kultur der Anfrage ("1,5" ist 1,5 in pt) und der Browser in der invarianten. Eine als Text geschriebene Zahl braucht keine Kultur: beide Ziele schreiben den Text der Kultur. Sag, was du meinst: übergib CultureInfo.InvariantCulture.
EQ2111 GetService ohne Typargument, das hinübergehen kann: das Register ist nach dem NAMEN der Schnittstelle geschlüsselt, und es gibt nichts, worauf zu schlüsseln wäre. Rufe die generische Überladung auf.
EQ2113 ConfigureAwait wird verworfen, es gibt einen Kontext, in dem fortzusetzen ist, und es zu verwerfen würde ein NICHT KONSTANTES Argument wegwerfen, ohne es auszuwerten. Übergib eine Konstante, oder werte den Ausdruck zuerst in eine lokale Variable aus.

EQ3001–EQ3007: der Photon-App-Generator

Code Bedeutung
EQ3001 Eine Photon-App hat kein Programm.
EQ3002 Eine Photon-App hat mehr als ein Programm.
EQ3003 Der Grund einer Fähigkeit muss eine Konstante sein.
EQ3004 Der Schlüssel einer Berechtigung muss eine Konstante sein: er wird zur Build-Zeit in die App signiert, also erreicht ein zur Laufzeit gebauter Schlüssel die Signatur nie.
EQ3005 Eine Bundle-Tatsache muss konstant sein: die Info.plist wird zur Build-Zeit geschrieben, also erreicht ein zur Laufzeit gebautes Argument das Manifest der App nie. Jedes der Argumente zählt, und was die Methode auch nimmt: eine Zeichenkette, ein bool, ein AppCategory.
EQ3006 Eine Photon-App schreibt ihren eigenen Einstiegspunkt. Das SDK erzeugt einen aus CreateApp, also hat eine App, die ihr Main (oder ihre Top-Level-Anweisungen) behielt, zwei, was der Compiler als CS0017 gegen eine generierte Datei meldet, die die App nie gesehen hat. Lösche das der App: was es zuerst tat, gehört in CreateApp, die einzige Hälfte, die Android ausführt.
EQ3007 Ein Schema, das eine Telefon-App öffnet, muss eine Konstante sein. Ein Telefon antwortet CanOpen nur für die Schemata, die sein Manifest auflistet (LSApplicationQueriesSchemes unter iOS, queries unter Android), und das Manifest wird zur Build-Zeit geschrieben, also würde ein an builder.Workspace.Opens(…) oder an OpenUrlPolicy.Allowing(…) übergebenes Schema, das zur Laufzeit gebaut wird, seine Links öffnen und ihm würde dennoch gesagt, nichts öffne sie. Nur dort gemeldet, wo ein Manifest geschrieben wird: eine Desktop-App liest die Zeile allein zur Laufzeit.

EQ3101–EQ3105: die Quellgeneratoren

Die generierte Fabrikfläche und die Formularmodelle.

Code Bedeutung
EQ3101 Eine Komponente wählt mehr als einen Fabrikkonstruktor ([UiFactory]).
EQ3102 Zwei Komponenten teilen einen Namen.
EQ3103 Eine Eigenschaft eines Formularmodells hat einen Typ, den kein Textfeld halten kann.
EQ3104 Ein Validierungsattribut hat keine Regel, zu der es werden kann.
EQ3105 Ein [Compare] benennt eine Eigenschaft, die dieses Formular nicht hat.

EQ4xxx: der SDK-Build

Von den MSBuild-Targets des SDK selbst erhoben, vor oder nach dem Lauf des Compilers.

Code Bedeutung Was zu tun ist
EQ4001 Das eQuantic-Icon-Werkzeug, eqicon, das die App-Icons, den Vektorkatalog, das Fähigkeitsmanifest und das macOS-Bundle schreibt, fehlt dort, wo das SDK es sucht. In einem Build aus dem Quellbaum des Repositorys wurde eQuantic.UI.Native.Build nicht vor diesem Projekt gebaut: ein kaputter Build-Graph. Aus einem Paket wurde das Paket ohne tools/net10.0/eqicon.dll ausgeliefert. Keines von beiden wird durch zweimaliges Bauen behoben. Aus der Quelle ist das Werkzeug ein ProjectReference jedes App-Projekts, sieh also auf die Fehler über diesem, der Build des Werkzeugs selbst ist fehlgeschlagen, oder darauf, wer die Kante entfernt hat. Aus einem Paket leere den eQuantic-Cache (dotnet msbuild -t:ClearEQuanticCache), stelle erneut wieder her, und melde die Paketversion, wenn es bleibt.
EQ4002 Der eQuantic-Compiler, eqc, der die Komponenten der App in JavaScript verwandelt, fehlt dort, wo das SDK ihn sucht: in einem Build aus dem Quellbaum des Repositorys wurde eQuantic.Build nicht vor diesem Projekt gebaut; aus einem Paket wurde das Paket ohne tools/net10.0/eqc.dll ausgeliefert; oder ein ausdrücklicher EqcCliPath benennt eine Datei, die nicht da ist. Das war früher eine Warnung, und eine Seite ohne JavaScript. Wie EQ4001: nicht durch zweimaliges Bauen behoben. Aus der Quelle lies die Fehler über diesem oder stelle den ProjectReference wieder her; aus einem Paket leere den eQuantic-Cache und stelle wieder her; mit einem ausdrücklichen EqcCliPath korrigiere den Pfad.
EQ4003 (Warnung) Die App wird mit einer Ausnahme der gehärteten Laufzeit signiert (com.apple.security.cs.*, die Familie, die einen Schutz lockert, den die gehärtete Laufzeit auferlegt), während der Build nicht gehärtet ist. Der Schlüssel erreicht die Signatur und das System befragt sie nie. Das SDK signiert mit --options runtime nur dann, wenn EQuanticHardenedRuntime true ist, also ist jeder andere nicht leere Wert ein ungehärteter Build, false, off und der Tippfehler ture gleichermaßen, und die Meldung zitiert zurück, was geschrieben wurde. Ein LEERER Wert ist ein gewöhnlicher Entwicklungsbuild und wird nie gemeldet. Setze EQuanticHardenedRuntime=true, oder lass die Deklaration weg. Nicht EQuanticSigningIdentity: das schaltet die Härtung nur dort ein, wo die Eigenschaft leer ist, also antwortet es hierauf nicht. Beachte, was dies NICHT bedeutet: die Berechtigungen der App Sandbox (com.apple.security.network.*, …files.*, …device.*) antworten auf PhotonEntitlements.AppSandbox, nicht auf die gehärtete Laufzeit, und ein Ad-hoc-Entwicklungsbuild beachtet sie, also werden sie hier nie gemeldet.
EQ4004 Ein Programm, das der Build gestartet hat, endete mit einem Exit-Code ungleich null und meldete keinen eigenen Fehler: eqc, eqicon, bun, git, oder unter macOS codesign, ditto, notarytool, stapler oder hdiutil. Die Meldung benennt das Programm und die Argumente, mit denen es gestartet wurde, wie MSBuilds Exec seinen Befehl benannte, außer bei einem Aufruf, dessen Befehlszeile nicht wiedergegeben wird: der des Notars, die ein Passwort trägt. Ein Programm, das seine eigenen Fehler gemeldet hat, etwa eqcs EQ-Codes, bekommt danach kein EQ4004. Führe den Befehl aus, den die Meldung benennt, aus dem Ordner des Projekts, um zu sehen, was das Programm sagt. Ein Programm, das überhaupt nicht auf der Maschine ist, ist MSBuilds eigenes MSB6003.

Clone this wiki locally