c# - 泛型方法中的隐式类型转换

标签 c# generics

为什么我在以下代码中遇到编译器错误:不能隐含地将类型 SpecialNode 转换为 T,即使 T 必须从 NodeBase 派生,正如我在 where 子句中定义的那样,即使 SpecialNode 实际上是派生的来自 NodeBase?

    public static T GetNode<T>() where T : NodeBase
    {
        if (typeof(T) == typeof(SpecialNode))
        {
            return ThisStaticClass.MySpecialNode; // <-- compiler error
        }
        if (typeof(T) == typeof(OtherSpecialNode))
        {
            return ThisStaticClass.MyOtherSpecialNode; // <-- compiler error
        }
        ...
        return default(T);
    }

最佳答案

编译器不会读取您的 if 检查以意识到在这一特定行中,T 必须是 SpecialNode

你需要先转换到NodeBase,像这样:

return (T)(NodeBase)MySpecialNode;

您需要进行强制转换,因为(就编译器所知)T 可能是 MyOtherSpecialNode,并且您不能将 MyOtherSpecialNode 强制转换为 MySpecialNode.

编辑:你可以像这样用一个类型转换来做:

NodeBase retVal;

if (typeof(T) == typeof(SpecialNode))
    retVal = MySpecialNode;
else if (typeof(T) == typeof(OtherSpecialNode))
    retVal = MyOtherSpecialNode;

return (T)retVal;

关于c# - 泛型方法中的隐式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2765924/

相关文章:

C# 如何将 HttpClient Keep-Alive 设置为 false

Java泛型覆盖方法

go2go.playground - 预期类型,发现 'type'(还有 1 个错误)

Java 泛型 : Type Extension In Method Declaration Parameters

C# dotnet web 应用程序 : Dll's xml config file is lost when Publishing

c# - 获取具有相同服务器 ID 的多用户控件的 clientID

c# - 忽略鼠标点击并将键盘输入发送到外部应用程序

C#逐行读取文本文件并编辑特定行

c# - 使用空参数调用 Type.MakeGenericType()

arrays - VHDL 初始化 std_logic_vector 的通用数组