c# - typeof 泛型和强制类型

标签 c# generics

<分区>

假设我们有通用方法:

public void GenericMethod<T>(T item)
{
    var typeOf = typeof(T);
    var getType = item.GetType();
}

我们使用以下参数调用它:

GenericMethod(1)
GenericMethod((object) 1)

结果是:

typeOf = System.Int32
getType = System.Int32

typeOf = System.Object
getType = System.Int32

有人能解释一下为什么转换为对象的整数类型返回 System.Object,而 .GetType() 返回 System.Int32 吗?

最佳答案

typeof返回通用参数的静态(编译时) 类型 T .

GetType返回变量 item 中包含的动态(运行时) 类型.


如果您将方法设为非泛型,则更容易看出差异。让我们假设 BA 的子类型:

public void NonGenericMethod(A item)
{
    var typeOf = typeof(A);
    var getType = item.GetType();
}

在这种情况下,调用 NonGenericMethod(new B())会产生

A
B

推荐进一步阅读:


现在,您可能会问:您为什么使用 NonGenericMethod(A item)在你的例子中而不是 NonGenericMethod(B item) ? 这是个很好的问题!考虑以下(非通用)示例代码:

public static void NonGenericMethod(A item)
{
    Console.WriteLine("Method A");
    var typeOf = typeof(A);
    var getType = item.GetType();
}
public static void NonGenericMethod(B item)
{
    Console.WriteLine("Method B");
    var typeOf = typeof(B);
    var getType = item.GetType();
}

当您调用 NonGenericMethod((A) new B()) 时,您会得到什么? (这类似于您示例中的参数 (object) 1)?

Method A
A
B

为什么?因为重载解析是在编译时完成的,而不是在运行时。在编译时,表达式的类型 (A) new B()A ,就像 (object) 1 的编译时类型一样是object .

推荐进一步阅读:

关于c# - typeof 泛型和强制类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54827467/

相关文章:

c# - 如何知道 Process.Start() 创建的进程何时关闭?

c# - 如何删除json中的附加键

c# - 为什么将 int.MinValue 除以 -1 在未经检查的上下文中抛出 OverflowException?

c# - 使用复杂类型调用存储过程 Entity Framework 动态结果集

Java 泛型 : Returning object of generic class with type parameter that is a super of argument T

c# - 选择 lambda 用法

泛型类的 Swift 委托(delegate)

c# - 循环泛型类型参数

c# - 如何获取泛型类型参数的类型名称?

java - 使用 Jackson 将列表序列化为 xml,无需注释?