c# - 有没有办法在 C# 中进行动态隐式类型转换?

标签 c# type-conversion dynamic-cast implicit-conversion dynamic-invoke

给定带有隐式转换运算符的此类:

public class MyDateTime
{
    public static implicit operator MyDateTime(System.Int64 encoded)
    {
        return new MyDateTime(encoded);
    }

    public MyDateTime(System.Int64 encoded)
    {
        _encoded = encoded;
    }
    System.Int64 _encoded;
}

我现在可以执行以下操作:

long a = 5;
MyDateTime b = a;

但不是以下内容:

long f = 5;
object g = f;
MyDateTime h = g;

这给出了编译时间:

Cannot implicitly convert type 'object' to 'MyDateTime'.

对我来说很有意义。

现在我修改前面的例子如下:

long f = 5;
object g = f;
MyDateTime h = (MyDateTime)g;

这编译得很好。现在我得到一个运行时 InvalidCastException:

Unable to cast object of type 'System.Int64' to type MyDateTime'.

这告诉我,C# 隐式转换运算符仅在编译时应用,而不会在 .NET 运行时尝试将对象动态转换为另一种类型时应用。

我的问题:

  1. 我说的对吗?
  2. 还有其他方法吗?

顺便说一句,完整的应用程序是我正在使用 Delegate.DynamicInvoke() 来调用一个函数,该函数接受一个 MyDateTime 参数,以及我传递给 DynamicInvoke 的参数很长。

最佳答案

Am I correct?

是的,是的,你是。为了挑剔,您应该说“用户定义的隐式转换”而不是“隐式转换”——转换(几乎)总是显式的。但是您推断重载决策选择调用哪个用户定义的转换在编译时而不是在运行时是正确的。

Is there some other way to do this?

是的。在 C# 4 中,如果您将“对象”键入为“动态”,那么我们将在运行时再次启动编译器并重新执行对操作数的所有分析就像它们的编译时类型一样是当前的运行时类型。正如您可能想象的那样,这并不便宜,但如果您在紧密循环中执行此操作,我们在缓存和重用结果方面非常聪明。

关于c# - 有没有办法在 C# 中进行动态隐式类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2090092/

相关文章:

c# - 从缓存获取对象时,代码试探性无法访问

c# - 是否可以在程序集级别启用 Visual Studio 中的循环依赖项?相互依赖的组件甚至可能吗?

type-conversion - index() 错误消息对于第三个参数不正确?

C++:即使被转换的对象不是 NULL,dynamic_cast 也会导致 SEGFAULT。怎么会这样?

c++ - 为什么 dynamic_cast 可以用于非多态类型的向上转换?

c++ - C++ 中的 dynamic_cast 和 static_cast

c# - 过时的属性不会在 VS2010 中引起任何编译器警告

c# - 基本表单控件在子表单中不可见

node.js - 将字符串转换为数字 node.js

c# - 从 Decimal 转换为 Single 并返回。为什么会抛出溢出异常?