通用类型推断如何在C#中工作?

chr*_*ris 3 .net c# generics type-inference c#-3.0

如果我有以下代码

private BaseMessage getMessage()
{
    return new OtherMessage();
}

private void CheckType<T>(T type)
{
    Console.WriteLine(type.GetType().ToString());
    Console.WriteLine(typeof(T).ToString());
}

private void DoChecks()
{
     BaseMessage mess = getMessage();
     CheckType(mess);
}
Run Code Online (Sandbox Code Playgroud)

为什么我会输出不同的类型?有没有得到类型推断使用传递的对象的实际类型?

Shd*_*dNx 6

泛型类型推断意味着编译器会自动解析传递的参数类型,而无需您明确指定要传递的类型.这意味着这是在编译时完成的:在代码中,在编译期间,编译器只知道BaseMessage,因此参数将作为BaseMessage传递.在运行时,参数的实际类型将是OtherMessage,但这与编译器无关.

因此,您获得的输出绝对有效.除了总是使用Object.GetType而不是typeof()之外,我不知道有什么办法可以解决这个问题.

  • @chris如果你需要在一般方法中"品尝"类型风味,那几乎总是存在设计错误,因为这意味着它不是通用的 (4认同)

Cod*_*ray 5

原因是您已将变量声明mess为类型BaseMessage.因此,当你要求类型时,它就会返回BaseMessage.

GetTypetypeof行为的方式有所不同.在运行时GetType返回对象的实际类型,如果涉及继承,则可以与引用该对象的变量的类型不同(如示例中的情况).不像GetType,typeof在解决编译时的类型字面指定的确切类型.

public class BaseMessage { }

public class OtherMessage : BaseMessage { }

private BaseMessage getMessage()
{
    return new OtherMessage();
}

private void CheckType<T>(T type)
{
    Console.WriteLine(type.GetType().ToString());   // prints OtherMessage
    Console.WriteLine(typeof(T).ToString());        // prints BaseMessage
}

private void DoChecks()
{
     BaseMessage mess = getMessage();
     CheckType(mess);
}
Run Code Online (Sandbox Code Playgroud)

你必须为工作选择合适的工具.使用typeof时,你想在编译时的类型.使用GetType时,你想获得一个物体的运行时类型.