给定带有隐式强制转换运算符的此类:
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;
这给出了编译时间:
无法将类型“object”隐式转换为“MyDateTime”。
我感觉合理。
现在我将前面的例子修改如下:
long f = 5;
object g = f;
MyDateTime h = (MyDateTime)g;
这编译得很好。现在我得到一个运行时InvalidCastException
:
无法将“System.Int64”类型的对象转换为 MyDateTime 类型。
这告诉我,C# 隐式转换运算符仅在编译时应用,而不是在 .NET 运行时尝试将对象动态转换为另一种类型时应用。
我的问题:
- 我对么?
- 还有其他方法可以做到这一点吗?
顺便说一句,完整的应用程序是我Delegate.DynamicInvoke()
用来调用一个带MyDateTime
参数的函数,而我传递给的参数的类型DynamicInvoke
是 long。