CS0103 — DedSec Project
CS0103 — Το όνομα δεν υπάρχει στο τρέχον πεδίο Περιβάλλον: μεταγλωττιστής C (Roslyn), στο στάδιο της μεταγλώττισης. Γιατί εμφανίζεται Ο compiler δεν μπορεί να βρει το αναγνωριστικό στη θέση…
CS0103 — Το όνομα δεν υπάρχει στο τρέχον πεδίο
Περιβάλλον: μεταγλωττιστής C# (Roslyn), στο στάδιο της μεταγλώττισης.
Γιατί εμφανίζεται
Ο compiler δεν μπορεί να βρει το αναγνωριστικό στη θέση που χρησιμοποιείται. Συνήθεις αιτίες είναι ορθογραφία, διαφορετικά κεφαλαία/πεζά ή μια τοπική μεταβλητή που δηλώθηκε μέσα σε μπλοκ και πλέον είναι εκτός εμβέλειας. Το using από μόνο του δεν δημιουργεί μια τοπική μεταβλητή. Εξέτασε πρώτα την ακριβή γραμμή του διαγνωστικού.
Αναπαραγωγή: σφάλμα εμβέλειας
using System;
class Program {
static void Main() {
if (true) { int attempts = 3; }
Console.WriteLine(attempts); // CS0103: εκτός scope
}
}
Η δήλωση πρέπει να γίνει έξω από το μπλοκ, ενώ η ανάθεση μπορεί να μείνει μέσα:
using System;
class Program {
static void Main() {
int attempts = 0;
if (true) { attempts = 3; }
Console.WriteLine(attempts);
}
}
Αναμενόμενο αποτέλεσμα: 3. Το πρώτο παράδειγμα αποτυγχάνει σε dotnet build εντός έγκυρου C# project· το δεύτερο έχει ορατή και αρχικοποιημένη μεταβλητή.
Διαδικασία διάγνωσης
- Σύγκρινε το όνομα με τη δήλωση χαρακτήρα προς χαρακτήρα.
Attemptκαιattemptδεν ταυτίζονται. - Ακολούθησε τις αγκύλες: ένα τοπικό όνομα μέσα σε
if,forή άλλη μέθοδο δεν είναι διαθέσιμο παντού. - Αν πρόκειται για πεδίο αντικειμένου, βεβαιώσου ότι το καλείς από instance context· μια
staticμέθοδος δεν προσπελαύνει απευθείας μη στατικό πεδίο. - Σε conditional compilation εξέτασε αν η δήλωση όντως περιλαμβάνεται στην ενεργή ρύθμιση build.
- Επανέλεγξε πρώτα το project που ανέφερε το σφάλμα και όχι μια άσχετη βιβλιοθήκη.
Έλεγχος ορίων
Άλλαξε μόνο το attempts σε Attempts στο WriteLine και δες πάλι CS0103. Μην μετατρέπεις κάθε μεταβλητή σε global: επέλεξε τη μικρότερη σωστή εμβέλεια και πέρασε τιμές ως ορίσματα μεταξύ μεθόδων.