C# - <T> 对象转换

标签 c# com casting queryinterface

据我所知,如果我们正在处理 COM接口(interface),任何简单的转换通常都会触发 QueryInterface例程,用于确定对象是否实际实现了相应的 COM界面。

object whatever;
IComInterface casted = (IComInterface) whatever;

因此,根据编译器和优化,以下代码可能会触发 QueryInterface在内部对象转换实现中:

IComInterface comInteface;

// I guess nothing COM-related happens here, but I might be wrong
object whatever = comInteface; 

// This might or might not trigger the 'QueryInterface' call.
IComInterface comInterface2 = (IComInteface) whatever;

问:

假设我有一个通用的 List<T>实例:

List<IComInterface> list = new List<IComInterface>();

现在,我是否可以强有力地保证以下代码不会触发 QueryInterface基于类型转换?

List<IComInterface> list = new List<IComInterface>();
IComInterface comInterface = (...); // Somehow got it.
list.Add(comInteface);
IComInterface retrieved = list[0];
  • 使用 ArrayList而不是 List<T>这里实际上导致执行转换,因为你必须得到相应的 IComInterface来自你的无类型object实例。

  • 但是,如果是泛型,我想一切都应该在没有转换的情况下完成,但我实际上不确定它们在表面下是如何工作的。

  • 有没有可能 List<T>仍然以某种方式与 object 一起运行类型(因此,将在所述场景中调用基于 QueryInterface 的转换)?

  • 如果对上一个问题的回答是“否”,那么您是否不能保证任何可能的 IList<T> 都相同? ?

最佳答案

您可以将通用类型实例(例如 List<IComInterface> )视为从通用类型定义(例如 List<T> )创建的类,方法是将名称 T 逐字替换为名称 IComInterface .该类型不会像在某些语言(最值得注意的是 Java)中那样被“删除”,它与泛型类型实例一起保存,因此在泛型类型定义中声明为类型 T 的所有变量在泛型中保持强类型类型实例。

List<IComInterface> 的情况下,只要您在编译时插入已知为 object 类型的对象,就不会转换为 IComInterface 或从 ojit_code 转换。您帖子中的代码就是这种情况,但可能并不总是如此。例如,当你插入一个动态类型的对象时,编译器会添加一个强制转换:

dynamic comInteface = ...
list.Add(comInteface); // There will be an implicit cast here

关于C# - <T> 对象转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11451614/

相关文章:

c# - 使用 System.Net.Http 避免 TRUSTWORTHY ON 和 PERMISSION_SET = UNSAFE

delphi - 如何对与第三方 COM 对象交互并实例化第三方 COM 对象的代码进行单元测试?

c++ - 在 objective-c 中使用 ARC 转换 C++ 类型

C++编译时断言BASE是EXTENDED的基类并且具有相同的内存地址

javascript - 如何将对象从 Angular 发布到 webapi Controller

c# - 如何指定swagger的默认打开版本?

c# - Expression_Host 程序集的数量不断增长

c# - 通过 COM 对象连接 x64 应用程序时出现问题

php - 无法在 PHP 中使用 COM 打开 Word 文档

java日期到sql日期类型转换