2

背景故事是我希望能够为 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>

有一个更好的方法吗?为什么我不能访问 col inside CType

4

1 回答 1

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).

于 2013-06-13T13:50:07.493 回答