【问题标题】:How does generic type inference work in C#?泛型类型推断在 C# 中如何工作?
【发布时间】:2011-06-20 13:54:06
【问题描述】:

如果我有以下代码

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);
}

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

【问题讨论】:

  • 可以添加 Console.WriteLine 的输出吗?
  • 你得到什么输出?你期望有什么输出?
  • 我的输出是“BaseMessage”和“OtherMessage”
  • 而且我会为两者都添加“OtherMessage”,我认为 c# 不使用运行时类型来推断泛型类型?
  • 是的,你期待什么?我希望你得到的输出完全正确。

标签: c# .net generics c#-3.0 type-inference


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这就是我的想法,并确认我将如何从通用方法中解决问题。谢谢
  • @chris 如果您需要“品尝”泛型方法中的类型风味,那么几乎总是会出现设计错误,因为这意味着它不是泛型的
【解决方案2】:

原因是您已将变量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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多