泛型类型推理在C#中是如何工作的?

泛型类型推理在C#中是如何工作的?,c#,.net,generics,c#-3.0,type-inference,C#,.net,Generics,C# 3.0,Type Inference,如果我有以下代码 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() { B

如果我有以下代码

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);
}
private BaseMessage getMessage()
{
返回新的OtherMessage();
}
专用无效支票类型(T类型)
{
Console.WriteLine(type.GetType().ToString());
Console.WriteLine(typeof(T).ToString());
}
私人证券交易所()
{
BaseMessage mess=getMessage();
支票类型(mess);
}

为什么要输出不同的类型?有没有办法让类型推断使用所传递对象的实际类型?

原因是您已将变量
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);
}
公共类基消息{}
公共类OtherMessage:BaseMessage{}
私有BaseMessage getMessage()
{
返回新的OtherMessage();
}
专用无效支票类型(T类型)
{
Console.WriteLine(type.GetType().ToString());//打印其他消息
Console.WriteLine(typeof(T).ToString());//打印BaseMessage
}
私人证券交易所()
{
BaseMessage mess=getMessage();
支票类型(mess);
}

你必须为这项工作选择合适的工具。要在编译时获取类型,请使用
typeof
。当您想要获取对象的运行时类型时,请使用
GetType

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


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

您可以添加Console.WriteLine的输出吗?您得到了什么输出?你希望得到什么输出?我的输出是“BaseMessage”和“OtherMessage”,我会扩展“OtherMessage”两个,我按c#不使用运行时类型推断泛型类型?是的,你希望得到什么?我希望您得到的正是结果。谢谢,这就是我的想法,并确认了我将如何从通用方法中解决这个问题。Thanks@chris如果您需要在泛型方法中“品尝”类型味道,那么几乎总是会出现设计错误,因为这意味着它不是泛型的