给定带有隐式转换运算符的此类:
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 运行时尝试将对象动态转换为另一种类型时应用。
我的问题:
- 我说的对吗?
- 还有其他方法吗?
顺便说一句,完整的应用程序是我正在使用 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/