C# 为什么编译器不允许将Class.System.Type作为T参数传递给泛型方法
编译错误: Visual Basic.NET编译错误:“未定义t类型”C# 为什么编译器不允许将Class.System.Type作为T参数传递给泛型方法,c#,vb.net,generics,types,C#,Vb.net,Generics,Types,编译错误: Visual Basic.NET编译错误:“未定义t类型” C#编译错误:“t”是一个变量,但用作类型 为何我不能这样做: VB: For i = 0 To dt.Columns.Count - 1 Dim t As Type = dt.Columns(i).DataType Dim field = dt.GetValueSafely(Of t)(dt.Columns(i).ColumnName, 0) ' compilation error' Next for (
C#编译错误:“t”是一个变量,但用作类型 为何我不能这样做: VB:
For i = 0 To dt.Columns.Count - 1
Dim t As Type = dt.Columns(i).DataType
Dim field = dt.GetValueSafely(Of t)(dt.Columns(i).ColumnName, 0) ' compilation error'
Next
for (int i = 0; i <= dt.Columns.Count - 1; i++)
{
Type t = dt.Columns[i].DataType;
var field = dt.GetValueSafely<t>(dt.Columns[i].ColumnName, 0); // compilation error
}
C#:
For i = 0 To dt.Columns.Count - 1
Dim t As Type = dt.Columns(i).DataType
Dim field = dt.GetValueSafely(Of t)(dt.Columns(i).ColumnName, 0) ' compilation error'
Next
for (int i = 0; i <= dt.Columns.Count - 1; i++)
{
Type t = dt.Columns[i].DataType;
var field = dt.GetValueSafely<t>(dt.Columns[i].ColumnName, 0); // compilation error
}
for(inti=0;i,因为你用错了
编译器已经告诉您您的错误,t
不是一个类型,而是一个变量
为此,您需要在该位置使用实际的类型type
出于无法在运行时确定类型的原因,有很多文档,包括on,例如当调用使用泛型的函数时,编译器希望您在小于/大于符号(“”)之间给它一个类/结构名称
您将向它传递一个实例变量(t
):这是一个实际的对象实例,而不是编译器期望的类/结构名
一种实现方法是通过反射调用GetValueSafety()
方法。基本上,通过使用对象的类型dt
从要调用的方法中检索MethodInfo
,然后指定此方法的泛型类型参数,然后调用它(传递所需的参数)。在您的情况下,这可以归结为以下内容:
MethodInfo method = dt.GetType().GetMethod("GetValueSafety");
MethodInfo callableMethod = method.MakeGenericMethod(t);
Object [] callParams = new Object[] { dt.Columns[i].ColumnName, 0 };
callableMethod.Invoke(dt, callParams);
是的,你不能这样做,即使你可以,你希望如何处理字段
?理论上它可以是任何类型。@HansPassant如果该方法不是泛型的,错误消息会说该方法不是泛型的。错误并没有这样说。它说t
是一个变量,而不是一个类型,这正是你不能这样做的原因这样做。如果您声明了field
而没有var
您会选择什么类型?我不明白在这种情况下为什么需要泛型。因为t可以是任何东西,只需传递对象即可。IDE将不知道在执行“field”时显示什么