2013-06-13 4 views
2

backstory는 항상 DBNull.Value을 확인하지 않고도 DataTable에 대해 빈 행을 초기화 할 수 있기를 원합니다. 새 빈 행을 만들고 각 행의 값을 해당 열의 기본 형식으로 채우는 확장 메서드가 있습니다.각 범위 내에서 사용할 수없는 각 변수

<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 

나는 (CType 내에서 하나) C-선명의 내용은

Cannot resolve symbol 'col' 

, Default<T>

인가를 호출하는 것과 동일해야합니다 CType(Nothing, T)를 호출 COL의 두 번째 사용에 대한 다음과 같은 메시지가 이렇게하는 더 좋은 방법이 있습니까? CType 내의 col에 액세스 할 수없는 이유는 무엇입니까?

답변

3

CType은 런타임 기능이 아닙니다. 그것은 컴파일 시간입니다. 두 번째 인수의 데이터 유형은 컴파일시 지정되어야합니다.

에서는 CType

http://msdn.microsoft.com/en-us/library/4x2877xb%28v=vs.80%29.aspx

는 변환 코드는 표현식을 평가하는 코드의 일부분임을 의미하는 인라인 컴파일된다. 경우에 따라 변환을 수행하는 프로 시저를 호출 할 필요가 없으므로 실행 속도가 빨라집니다.

NewBlankRow은 일반적인 방법이 아니기 때문에이 경우에는 Default<T>과 같지 않습니다. 그럼에도 불구하고 Default<T>도 컴파일 시간이며 T이 런타임 표현식으로 지정된 경우 사용할 수 없습니다.

col.DataType의 기본 인스턴스를 만들려면 Activator.CreateInsatnce(col.DataType)과 같은 리플렉션을 사용할 수 있습니다.

+0

와우! 좋은 대답. 감사! – KyleMit