对于每个范围内不可用的每个变量

时间:2013-06-13 13:43:05

标签: vb.net foreach

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

1 个答案:

答案 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)