#c# #types
#c# #типы
Вопрос:
Я считываю значения из mdb-файла локального доступа. Одно значение хранится в виде строки в базе данных, и у меня оно есть в таблице. При использовании GetType()
метода он возвращает «System.Строка » и я могу распечатать ее на консоли без проблем, но когда я хочу использовать ее в качестве атрибута для другого метода (требуется строка) Я получаю сообщение об ошибке («Не удается преобразовать из ‘object’ в ‘string'» и то же самое для ‘int’). Те же проблемы возникают с некоторыми значениями int.
Я делаю что-то неправильно или в чем проблема в таком случае?
Console.WriteLine(dt.Rows[0][ProjName]); //prints project_name
Console.WriteLine(dt.Rows[0][ProjName].GetType()); //print "System.String"
Project = new Project(dt.Rows[0][ProjName], dt.Rows[0][MinDay], dt.Rows[0][MinWeek], dt.Rows[0][DayWeek]); //Error
Project = new Project(Convert.ToString(dt.Rows[0][ProjName]), Convert.ToInt32(dt.Rows[0][MinDay]), Convert.ToInt32(dt.Rows[0][MinWeek]), Convert.ToInt32(dt.Rows[0][DayWeek])); //Works Fine
Конструктор для класса Project:
public Project(string projectName, int hoursPerDay, int hoursPerWeek, int daysPerWeek)
Комментарии:
1. Ваше использование
Console.WriteLine()
вызывает перегрузку, принимающую параметр типаObject
. Эта функция overlaod внутренне вызываетToString()
заданное значение объекта, демонстрируя то, что вы видите.
Ответ №1:
Вы указали в своем ответе, что это работает при преобразовании, и это необходимо, поскольку они не являются строками и целыми числами. Они являются объектами. Вы можете создать methid для обработки этого, если хотите.
public Project CreateProject(object projectName, object hoursPerDay, object hoursPerWeek, object daysPerWeek)
{
return new Project(projectName.ToString(), Convert.ToInt32(hoursPerDay), Convert.ToInt32(hoursPerWeek), Convert.ToInt32(daysPerWeek);
}
Комментарии:
1.
projectName.ToString()
(в скобках) — или OP получит другую странную ошибку 🙂
Ответ №2:
Вы должны явно приводить объекты:
Для приведения к строке используйте:
Object.ToString();
Для преобразования в целые числа используйте:
Int32.TryParse(String, out int);
Ваш конструктор становится
Project = new Project(dt.Rows[0][ProjName].ToString(), Int32.Parse(dt.Rows[0][MinDay]), Int32.Parse(dt.Rows[0][MinWeek]), Int32.Parse(dt.Rows[0][DayWeek]));
Примечание: Использование Int32.Parse вместо Int32.TryParse предполагает, что предоставленный аргумент всегда является допустимым значением int, и не дает вам возможности проверить, было ли приведение успешным.
Ответ №3:
dt.Rows[0][ProjName]
возвращает тип object
, и ваш метод ожидает string
. Даже если вы знаете, что это строка, это не очевидно для компилятора и должно быть указано явно с использованием приведения, как вы показываете в своем последнем примере, хотя простое приведение должно быть более эффективным, чем ненужное преобразование:
Project = new Project((string)dt.Rows[0][ProjName], ...