c# - 使用隐式运算符重载进行转换

标签 c# casting implicit-conversion

给定两个类:

class BaseObject
{
}

class Some
{
    public static implicit operator BaseObject(Some d)
    {
        Console.WriteLine("Some.implicit");
        return new BaseObject();
    }
}

我需要能够使用隐式运算符重载从 object(实际上是 Some)转换为 BaseObject。我使用了显式转换,但由于 InvalidCastException 而无法正常工作:

object obj = new Some();

var baseObject = (BaseObject)(obj); // InvalidCastException here

更新 对于那些不了解隐式转换的人。这有效:

Some obj = new Some();

BaseObject baseObject = obj; // writes "Some.implicit"

问题是我收到 obj 作为 object

最佳答案

当源和目标类型在编译时已知时,转换的类型也在编译时确定。在这种情况下,BaseObject 派生自 object,因此从 objectBaseObject 的转换被视为典型的向下转换,如果在运行时确定该对象不是 BaseObject,则会失败。

要在运行时确定类型转换,您需要使用dynamic

dynamic obj = new Some();
var baseObject = (BaseObject)obj; // works

或者如果obj的声明不能改变,

object obj = new Some();
var baseObject = (BaseObject)(dynamic)obj; // also works

关于c# - 使用隐式运算符重载进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27276209/

相关文章:

c++ - 将 float 宏与 int* 一起切换 - 它有什么作用?

c++ - 在引用初始化中使用已删除的复制构造函数进行复制初始化

c++ - 什么时候在 C++ 中选择可行的构造函数时不考虑用户定义的转换序列?

c# - 如何比较两个忽略 C# 中某些键的 JSON?

c# - 是否可以以文化不变的方式动态构建字符串?

java - 转换为ArrayList

c++ - static_cast<T>(...) 是编译时还是运行时?

c++ - 你可以使用关键字显式来防止方法参数的自动转换吗?

c# - 在 asp.net 中写入 csv 文件

c# - 具有 EasynetQ 消息生命周期的简单注入(inject)器 Ioc DBContext