2010-04-30 60 views
1

我在使用datatable.asenumerable()上的linq时遇到问题。
这会引发InvalidCastException。字段<t> invalid cast

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

这工作正常。

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

我在想什么?

问候斯文

回答

1

为什么你会期望它的工作?下面的代码无法编译:

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

而这样做:

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

作中,你不能只投一个字符串转换为日期时间,因此,如果您的值是一个字符串,你需要明确地转换它。

+0

当你这样说的时候,这很明显。 缺乏经验和工作大脑我猜。 非常感谢! – Zwempha 2010-04-30 06:43:33

0

你确定你的“日期”列是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 2010-04-30 06:45:50

0

Cast支援相关类型之间。 stringdate不属于同一层次&因此不可能直接翻译。

如果您确定这些类型是相关的并且可以进行转换,则可以使用强制转换。

Parse与演员不同。
即你正在告诉运行时,看看它是否可以被解析来创建一个日期(根据你的例子)。