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

时间:2011-02-03 10:32:59

标签: 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()
{
     BaseMessage mess = getMessage();
     CheckType(mess);
}

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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);
}

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