Eri*_*ric 11 c# dynamic-cast type-conversion implicit-cast 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;
}
Run Code Online (Sandbox Code Playgroud)
我现在可以做以下事情:
long a = 5;
MyDateTime b = a;
Run Code Online (Sandbox Code Playgroud)
但不是以下内容:
long f = 5;
object g = f;
MyDateTime h = g;
Run Code Online (Sandbox Code Playgroud)
这给出了编译时间:
无法将类型'object'隐式转换为'MyDateTime'.
我感觉合理.
现在我修改前面的例子如下:
long f = 5;
object g = f;
MyDateTime h = (MyDateTime)g;
Run Code Online (Sandbox Code Playgroud)
编译好了.现在我得到一个运行时InvalidCastException:
无法将"System.Int64"类型的对象强制转换为"MyDateTime"类型.
这告诉我C#隐式转换运算符仅在编译时应用,并且在.NET运行时试图将对象动态转换为另一种类型时不应用.
我的问题:
顺便说一句,完整的应用程序是我Delegate.DynamicInvoke()用来调用一个带MyDateTime参数的函数,而我传递给的参数的类型很DynamicInvoke长.
Eri*_*ert 14
我对么?
是的,是的,你是.为了挑剔,你应该说"用户定义的隐式转换"而不是"隐式转换" - 转换(几乎)总是显式的.但是你的推论是,重载决策选择在编译时而不是在运行时调用哪个用户定义的转换是正确的.
还有其他方法可以做到这一点吗?
是.在C#4中,如果键入"对象"为"动态",那么我们在运行时再次启动编译器并重新执行操作数上的所有分析,就好像它们的编译时类型是当前的运行时类型一样.正如您可能想象的那样,这并不便宜,尽管我们非常聪明地进行缓存并重新使用结果,如果您在紧密循环中执行此操作.
| 归档时间: |
|
| 查看次数: |
2949 次 |
| 最近记录: |