Локальная переменная "персона" не может быть использована до ее объявления - PullRequest
0 голосов
/ 15 апреля 2020

Я делаю это школьное упражнение, где я должен заполнить пустые пробелы, чтобы завершить код. Вот что у меня есть:

using System;

class Program {
  public static void Main() {
    var person;
    person = Tuple.Create("John", "Doe");
    string s = "Hello, "+person.Item1 + ", " + person.Item2;
  }
}

При запуске я получаю следующую ошибку: Ошибка в исходной программе:

(5,5): ошибка CS0818: неявно типизированный декларатор локальной переменной должен включать инициализатор (6,5): ошибка CS0841: локальная переменная «персона» не может быть использована до ее объявления (7,26): ошибка CS0841: локальная переменная «персона» не может быть использована до нее объявляется

Вот пустые пробелы, которые мне разрешено редактировать.

 using System;

 class Program {   public static void Main() {
     ______ person;
     person = ________________________________
     _______ s = "Hello, "+person._____ + ", " + person.______;   } }

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Указанная ошибка на самом деле относится к правилам объявления неявного типа .
При объявлении переменной с использованием var у вас всегда должно быть что-то справа, например:

var i = 10; // var is internally converting to `int` by Compiler

, поскольку компилятор определяет тип var с правой стороны операции, и в этом случае он будет таким же, как:

int i = 10;

Так, в частности, для вашего случая, чтобы выполнить компиляцию кода успешные линии объединения 5 и 6, например:

var person = Tuple.Create("John", "Doe");
string s = "Hello, " + person.Item1 + ", " + person.Item2;
0 голосов
/ 15 апреля 2020

Внимательно прочитайте ошибки, которые выдает компилятор:

(5,5): ошибка CS0818: неявно типизированный декларатор локальной переменной должен включать инициализатор

Итак, это говорит о том, что если вы используете неявно типизированную локальную переменную, вам нужно ее инициализировать. Причина в том, что если вы не инициализируете его, как компилятор определит тип?

Это нормально:

var s = "Hello"; //this works because the compiler can figure out s is 
                 //a string because you are initializing it with the
                 //string "Hello".

Но это не так:

var s; //this fails because the compiler doesn't know what type s is.
s = "Hello";

Теперь вы можете избежать этого, не используя неявно типизированные переменные для начала; просто используйте явно типизированные переменные. Это прекрасно работает:

string s; //the compiler doesn't have to figure out anything, 
          //s is a string, period.
s = "Hello";

Хорошо, теперь мы знаем, что компилятор не может понять, что такое person. Как только это станет ясно, вы должны понимать, что объявление person не удалось, и, следовательно, компилятор полностью его проигнорирует, , но , и он будет продолжать пытаться осмыслить остальную часть вашего кода настолько, насколько он can.

Итак, когда станет ясно, что переменная person не существует в том, что касается компилятора, следующие две ошибки имеют смысл:

(6 , 5): ошибка CS0841: локальная переменная «персона» не может быть использована до ее объявления (7,26): ошибка CS0841: локальная переменная «персона» не может быть использована до того, как она объявлена ​​

Компилятор просто говорит вам, что вы пытаетесь использовать переменную с именем person, которая никогда не была объявлена. Один раз, когда вы пытаетесь инициализировать его: person = Tuple.Create("John", "Doe");, и один раз, когда вы пытаетесь получить к нему доступ: string s = "Hello, " + person.Item1 + ", " + person.Item2;

Исправьте объявление, и все будет работать.

...