首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当类型为隐式时,何时以及如何为受约束的泛型类型确定类型?

当类型为隐式时,何时以及如何为受约束的泛型类型确定类型?
EN

Stack Overflow用户
提问于 2018-08-02 20:44:25
回答 2查看 51关注 0票数 2

在使用泛型时,对象的类型是什么时候以及如何确定的,特别是当泛型类型被约束到类并且泛型类型是隐式的时候?

为了清楚起见,给出了以下代码:

代码语言:javascript
运行
AI代码解释
复制
public class MyClass {}
public class MyClassA : MyClass {}

public static string GetMyClassTypeByGenericType<T>(T myClass)
    where T: MyClass
{
    return typeof(T).Name;
}

public static string GetMyClassTypeByObjectType<T>(T myClass)
    where T: MyClass
{
    return myClass.GetType().Name;
}

MyClassA myA = new MyClassA ();
GetMyClassTypeByGenericType(myA); // Result: "MyClassA"
GetMyClassTypeByObjectType(myA); // Result: "MyClassA"

MyClass myClass = myA;
GetMyClassTypeByGenericType(myClass); // Result: "MyClass"
GetMyClassTypeByObjectType(myClass); // Result: "MyClassA"

为什么调用GetMyClassTypeByGenericType(myClass)返回基类的名称,而不是派生类的名称?我猜这个调用隐式地解析为基于变量myClass的声明类型的GetMyClassTypeByGenericType<MyClass>(myClass),而不是实际的类型。

基本上,我只想知道关于类型如何确定的泛型背后发生了什么。

下面是代码的小提琴:https://dotnetfiddle.net/pCj08M

EN

回答 2

Stack Overflow用户

发布于 2018-08-02 20:50:52

泛型类型解析完全是编译时(这就是为什么你不能在泛型类型参数中填充一个没有反射的Type变量,这并不是我们真正在讨论的问题)。

因此,当给定一个变量类型MyClassA时,它就会使用这个变量类型。对于MyClass也是如此,即使实际对象是派生类型。例如,如果您将其保存在object引用中,则第一个调用将打印System.Object

另一方面,GetType是运行时,所以它获得对象的实际类型,而不管保存它的变量的类型是什么。

票数 2
EN

Stack Overflow用户

发布于 2018-08-02 20:52:47

泛型类型构造,即解析每个泛型类型参数的实际类型的过程,总是在C#中的编译时执行(当然,除非您正在使用Reflection API

在您的示例中,编译器根据传递给该方法的参数的静态类型推断T类型。myClass的静态类型和你声明的完全一样:MyClass,所以当你在泛型方法中检查T时,你会发现这个T == typeof(MyClass)

另一方面,当您对传入的对象调用.GetType()时,您正在对该对象的动态(实际运行时)类型进行运行时查询,这当然就是您构造的MyClassA

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51661896

复制
相关文章
dotnet检测类型是否为泛型
private static string GetTableName(Type type) { //检测类型是否为泛型 if (type.GetType().IsGenericType) {//取出泛型类型 var types = type.GetGenericArguments(); type = types.FirstOrDefault(); }
hbbliyong
2018/11/23
8090
带你深挖Java泛型类型擦除以及类型擦除带来的问题
大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
业余草
2020/02/13
1.8K0
带你深挖Java泛型类型擦除以及类型擦除带来的问题
大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
Bug开发工程师
2020/02/13
3.9K1
带你深挖Java泛型类型擦除以及类型擦除带来的问题
【进阶之路】Java的类型擦除式泛型
Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw Type),并且会在相应的地方插入强制转型的代码。
南橘
2022/03/07
1.2K0
【进阶之路】Java的类型擦除式泛型
泛型与关联类型
和其他我学过的语言相比较,Rust有一些令人费解的概念。借用,所有权,借用检查这些概念大家应该已经都听说过了,我自己曾花费数小时在生命期问题上,最终不得不放弃抗争,转而采用Clone来解决。
MikeLoveRust
2020/04/07
1.3K0
JavaScript类型隐式转换
JavaScript 的数据类型之前已经讲过了,忘记的小伙伴出门左转,查看搞懂 JavaScript 的数据类型
闲花手札
2023/10/17
2450
泛型类、泛型方法、类型通配符的使用
       你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
泰斗贤若如
2019/06/19
4K0
mysql 隐式类型转换_scala的隐式转换
在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引。下面分析两种隐式转换的情况
全栈程序员站长
2022/11/07
2K0
mysql 隐式类型转换_scala的隐式转换
MySQL隐式类型注入与隐式转换
在MySQL中执行SQL查询时,如果SQL语句中字段的数据类型和表中对应字段的数据类型不一致时,MySQL查询优化器会将数据的类型进行隐式转换。
Petrochor
2022/06/07
1.3K0
MySQL隐式类型注入与隐式转换
Golang 泛型实现类型转换
Golang 标准库提供了很多类型转换的函数,如 strconv 包可完成 string 与基本数据类型之间的转换。
恋喵大鲤鱼
2022/12/30
3.5K0
Java泛型类型擦除问题
以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List<String> 和 List 在编译成字节码的时候实际上是一样的。因此java泛型只能做到编译期检查的功能,运行期间就不能保证类型安全。我最近遇到的一个问题如下:
用户7353950
2022/06/23
1.2K0
Kotlin 泛型:类型参数约束
上一篇文章讲了 Kotlin 泛型:基本使用,接下来我们再进一步了解泛型使用相关的进阶知识。
Kkkiro
2023/02/24
2.4K0
Kotlin 泛型之类型擦除
Kotlin 基于 Java 6,因此 Kotlin 天生支持泛型。但是 Kotlin 的泛型有自己的特点。
fengzhizi715
2019/06/11
1.8K0
如何实现隐式类型转换
Result 类型是许多编程语言中处理错误的常用方式,包括 C# 的 dotNext 库。在本文中,我们将通过例子回顾 C# 中 using 语句和隐式类型转换的使用。
newbe36524
2023/08/23
2080
JAVA泛型与类型擦除
为什么要用T而不是其它字母?事实上是可以任意字符串(如Result< something >),但是为了显得专业,一般约定几个大写字母在不同场景使用。
acupt
2019/08/26
1.8K0
.NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
2018-09-01 08:28
walterlv
2018/09/18
4.4K0
Java 泛型中的类型推断
这样写,编译器报错: jshell> List<?> unknows = new ArrayList<?>() | Error: | unexpected type | required:
一个会写诗的程序员
2018/08/17
3.1K0
C语言的隐式类型转换
预期结果时打印“in if”,但实际运行时却发现啥都没有输出。改为如下代码就可以正常输出“in if”,此时与预期相符
charlieroro
2020/03/24
1.1K0
「  [学习记录] JS 类型转换 - 隐式转换  」
简单来说就是,在比较运算过程中,基本数据类型会隐式转换,复杂数据类型不能隐式转换,但会使用toString()转成字符串,然后再进行隐式转换
青益
2023/01/09
5.3K0
「  [学习记录] JS 类型转换 - 隐式转换  」
点击加载更多

相似问题

Scala泛型类型和隐式类型类

10

泛型类型的隐式转换?

22

泛型的隐式类型发现

21

带泛型的隐式类型

23

隐式转换泛型类型对象

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档