通用方法参数 <T> 检测为变量

Generic method argument <T> detected as a variable

我目前正在为运行时post-处理管理编写代码。
我想使通用方法更有效,但我收到 2 条错误消息:

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);
    {
        // ...
    };
}