通用方法参数 <T> 检测为变量
Generic method argument <T> detected as a variable
我目前正在为运行时post-处理管理编写代码。
我想使通用方法更有效,但我收到 2 条错误消息:
- CS0118:'procType' 是一个变量,但像类型一样使用(在输出参数中)
- CS0119: 'Fog' 是一种类型,在给定上下文中无效(调用方法时)
void SetPostProc<T>(T procType, string IOHID, bool defval) where T : VolumeComponent
{
byte value = Convert.ToByte(IOHandler.GetVal(IOHID, defval));
volumeProfile.TryGet(out procType EFX);
{
};
}
SetPostProc(Fog, "", false);
我做错了什么?
提前感谢您的帮助!
首先,如果 Fog
确实是一个类型,而不是一个变量,那么您没有使用正确的方式调用泛型函数。如果从第一个参数看泛型类型不明显,那么你必须像这样显式指定它:
Fog myFogObject = ...;
SetPostProc<Fog>(myFogObject , "", false);
但是,如果 myFogObject
的类型在编译时已知(您的情况似乎就是这样),则不必指定泛型类型,因为编译器会自动计算出来:
Fog myFogObject = ...;
SetPostProc(myFogObject , "", false);
这应该可以解决您的第二个错误 (CS0119)。
第二个问题是 procType
是一个引用类型 T
对象的变量,而不是类型。您必须通过传入泛型类型参数 T
来调用 TryGet
函数,如下所示:
volumeProfile.TryGet<T>(out T EFX);
根据您尝试使用此代码执行的操作,我认为您甚至不需要 T procType
参数,只需要 T
通用参数就足够了:
void SetPostProc<T>(string IOHID, bool defval) where T : VolumeComponent
{
byte value = Convert.ToByte(IOHandler.GetVal(IOHID, defval));
volumeProfile.TryGet(out T EFX);
{
// ...
};
}
编辑: 如果你仍然想在 SetPostProc
函数之外得到 TryGet
的结果,你需要声明第一个参数你的函数作为 out
参数:
void SetPostProc<T>(out T procObj, string IOHID, bool defval) where T : VolumeComponent
{
byte value = Convert.ToByte(IOHandler.GetVal(IOHID, defval));
volumeProfile.TryGet(out procObj);
{
// ...
};
}
我目前正在为运行时post-处理管理编写代码。
我想使通用方法更有效,但我收到 2 条错误消息:
- CS0118:'procType' 是一个变量,但像类型一样使用(在输出参数中)
- CS0119: 'Fog' 是一种类型,在给定上下文中无效(调用方法时)
void SetPostProc<T>(T procType, string IOHID, bool defval) where T : VolumeComponent
{
byte value = Convert.ToByte(IOHandler.GetVal(IOHID, defval));
volumeProfile.TryGet(out procType EFX);
{
};
}
SetPostProc(Fog, "", false);
我做错了什么?
提前感谢您的帮助!
首先,如果 Fog
确实是一个类型,而不是一个变量,那么您没有使用正确的方式调用泛型函数。如果从第一个参数看泛型类型不明显,那么你必须像这样显式指定它:
Fog myFogObject = ...;
SetPostProc<Fog>(myFogObject , "", false);
但是,如果 myFogObject
的类型在编译时已知(您的情况似乎就是这样),则不必指定泛型类型,因为编译器会自动计算出来:
Fog myFogObject = ...;
SetPostProc(myFogObject , "", false);
这应该可以解决您的第二个错误 (CS0119)。
第二个问题是 procType
是一个引用类型 T
对象的变量,而不是类型。您必须通过传入泛型类型参数 T
来调用 TryGet
函数,如下所示:
volumeProfile.TryGet<T>(out T EFX);
根据您尝试使用此代码执行的操作,我认为您甚至不需要 T procType
参数,只需要 T
通用参数就足够了:
void SetPostProc<T>(string IOHID, bool defval) where T : VolumeComponent
{
byte value = Convert.ToByte(IOHandler.GetVal(IOHID, defval));
volumeProfile.TryGet(out T EFX);
{
// ...
};
}
编辑: 如果你仍然想在 SetPostProc
函数之外得到 TryGet
的结果,你需要声明第一个参数你的函数作为 out
参数:
void SetPostProc<T>(out T procObj, string IOHID, bool defval) where T : VolumeComponent
{
byte value = Convert.ToByte(IOHandler.GetVal(IOHID, defval));
volumeProfile.TryGet(out procObj);
{
// ...
};
}