背景故事是我希望能够为DataTable初始化空白行,而无需始终检查DBNull.Value
。我有一个扩展方法,它创建一个新的空白行,然后使用该列的默认类型填充行中的每个值。
<Extension()> _
Public Function NewBlankRow(ByVal table As DataTable) As DataRow
Dim row As DataRow = table.NewRow()
For Each col As DataColumn In table.Columns
row(col.ColumnName) = CType(Nothing, col.DataType)
Next
Return row
End Function
我收到以下消息,第二次使用col(CType
中的那个)
Cannot resolve symbol 'col'
对于C-Sharper,呼叫CType(Nothing, T)
应与呼叫Default<T>
相同
有更好的方法吗?为什么我无法在CType
内访问col?
答案 0 :(得分:3)
CType
不是运行时函数。这是编译时间。第二个参数中的数据类型必须是在编译时指定的。
http://msdn.microsoft.com/en-us/library/4x2877xb%28v=vs.80%29.aspx
CType是内联编译的,这意味着转换代码是评估表达式的代码的一部分。在某些情况下,没有调用过程来完成转换,这使得执行速度更快。
在此实例中,它与Default<T>
不同,因为NewBlankRow
不是通用方法。无论如何,Default<T>
也是编译时间,并且在T
被指定为运行时表达式时不可用。
要创建col.DataType
的默认实例,您可以使用反射,例如Activator.CreateInsatnce(col.DataType)
。