2012-04-12 3 views
3

Im получаю следующее сообщение об ошибке:Локальная переменная Декларация Issue

Cannot use local variable 'dob' before it is declared

Вот моя реализация

public class Person 
    { 
     ... 
     public string dob { get; set; } 
     ... 

     public int getAge() 
     { 
       DateTime origin = DateTime.Parse(dob); 
       return DateTime.Today.Year - origin.Year; 
     } 

     public string getFormattedDoB() 
     { 
       DateTime origin = DateTime.Parse(dob); 
       string dob = origin.ToString("d"); 
       return dob; 
     } 
    } 

Я не уверен, что сделать это, потому что он жалуется на это использование DOB в getFormattedDoB(), но не в getAge(), который приходит перед ним. Если бы кто-нибудь мог пролить свет на это, это было бы здорово

+1

Можете ли вы объяснить, почему 'dob' не' DateTime'? Вам понадобится довольно веская причина использовать 'string' для определенного типа. – ChaosPandion

+0

Это часть программы слияния, которая извлекает информацию из программы на основе Unix, поэтому проще переносить время в секундах в виде строки и анализировать в DateTime на конец Windows – CStreel

+0

OK, но кажется бессмысленным разобрать строку каждый раз , Почему бы просто не сделать это один раз? – ChaosPandion

ответ

9

Вы указали локальную переменную в getFormattedDoB, называемую dob. Компилятор не может определить разницу между этим и членом dob. Попробуйте добавить «это», где вы имеете в виду переменную-член, а не местный:

DateTime origin = DateTime.Parse(this.dob); 

еще лучше, не использовать то же имя для локальной переменной.

Редактировать: Если вы действительно не намеревались устанавливать переменную-член, а не создавать новую. В этом случае удалите «строку», как предложил Эндрю.

+0

Спасибо, что я этого не выбрал>< – CStreel

+3

Ошибка * не *, что компилятор не может отличить; компилятор * может * сказать разницу. Скорее, ошибка - это ошибка, о которой фактически сообщается **. Локальная переменная находится в области видимости по всему блоку; это ошибка, чтобы использовать ее * перед объявлением *. –

0

Вы повторно использовали имя переменной «dob» в getFormattedDoB как локальную строку, которая запутывает компилятор. Существует 2 возможных решения:

  1. Переименуйте локальный dob в getFormattedDoB (который вы действительно должны делать, потому что это хорошая практика).
  2. Использование this.dob в следующей строке, чтобы указать переменную уровня класса (который вы, вероятно, следует также делать, потому что это также хорошая практика:

    DateTime происхождения = DateTime.Parse (this.dob);

4

проблема заключается в том, что у вас есть два dob s- собственности и локальной переменной. Область действия переменной декларации (string dob = ...) является весь блок (все между { и }). Поэтому компилятор считает, что на line:

DateTime origin = DateTime.Parse(dob); 

вы используете dobпеременную прежде, чем она объявлена, когда (мы предполагаем), вы на самом деле имел в виду dobсвойство.

Как уже упоминалось, вы должны переименовать это свойство. Стандартное соглашение об именовании в C# будет

public String DateOfBirth { get; set; } 
//(assuming that is what DOB stands for) 

или еще

public DateTime DateOfBirth { get; set; } 
0

Вы повторного объявления DOB лучше

string dob = origin.ToString("d"); 

должно быть

dob = origin.ToString("d"); 
Смежные вопросы