Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么编译器不允许将Class.System.Type作为T参数传递给泛型方法_C#_Vb.net_Generics_Types - Fatal编程技术网

C# 为什么编译器不允许将Class.System.Type作为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 (

编译错误:

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 (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”时显示什么