2010-04-30 5 views
1

У меня возникают проблемы при использовании linq на datatable.asenumerable().
Это вызывает InvalidCastException.Поле <t> invalid cast

DateTime date=r.Field<DateTime>("date"); 

Это прекрасно работает.

DateTime date = DateTime.Parse(r.Field<string>("date")); 

Что мне не хватает?

Привет Sven

ответ

1

Почему вы ожидаете, что это работает? Следующий код не компилируется:

DateTime dt1 = (DateTime)"2004-01-01"; 

В то время как это делает:

DateTime dt1 = DateTime.Parse("2004-01-01"); 

Как, вы не можете просто бросить строку в DateTime, так что если значение является строкой, вам необходимо явно преобразовать его.

+0

Когда вы говорите так, это совершенно очевидно. Недостаток опыта и работающего мозга, я думаю. Спасибо! – Zwempha

0

Вы уверены, что ваш столбец "date" имеет тип DateTime?

Этот тестовый код работает, как ожидалось:

 DataTable dt = new DataTable(); 

     dt.Columns.Add(new DataColumn("date", typeof(DateTime))); 

     for (int i = 0; i < 10; i++) 
     { 
      DataRow row = dt.NewRow(); 
      row["date"] = DateTime.Now.AddDays(i); 
      dt.Rows.Add(row); 
     } 

     foreach (var r in dt.AsEnumerable()) 
     { 
      DateTime d = r.Field<DateTime>("date"); // no problems here! 

      Console.Write(d.ToLongDateString()); 
     } 
+0

Нет столбца строка, моя ошибка. – Zwempha

0

Cast работает между родственными видами. string и date не принадлежат к той же иерархии &, следовательно, прямой перевод возможен.

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

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

Смежные вопросы