Skip to main content
 首页 » 编程设计

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

2024年08月12日31daizhj

给定两个类:

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