如果我有以下代码
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);
}
为什么我输出不同的类型?有没有得到类型推断使用传递的对象的实际类型?
答案 0 :(得分:6)
泛型类型推断意味着编译器会自动解析传递的参数类型,而无需您明确指定要传递的类型。这意味着这是在编译时完成的:在代码中,在编译期间,编译器只知道BaseMessage,因此参数将作为BaseMessage传递。在运行期间,参数的实际类型将是OtherMessage,但这与编译器无关。
因此,您获得的输出绝对有效。除了总是使用Object.GetType而不是typeof()之外,我不知道有什么办法可以解决这个问题。
答案 1 :(得分:5)
原因是您已将变量mess
声明为BaseMessage
类型。因此,当您要求输入类型时,它会返回BaseMessage
。
GetType
和typeof
的行为方式不同。 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);
}
您必须为工作选择合适的工具。如果要在编译时获取类型,请使用typeof
。如果要获取对象的运行时类型,请使用GetType
。