问题
Given this class with an implicit cast operator:
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;
}
I can now do the following:
long a = 5;
MyDateTime b = a;
But NOT the following:
long f = 5;
object g = f;
MyDateTime h = g;
This gives a compile time:
Cannot implicitly convert type 'object' to 'MyDateTime'.
Makes sense to me.
Now I modify the previous example as follows:
long f = 5;
object g = f;
MyDateTime h = (MyDateTime)g;
This compiles fine. Now I get a runtime InvalidCastException
:
Unable to cast object of type 'System.Int64' to type MyDateTime'.
This tells me that C# implicit cast operators are applied at compile time only, and are not applied when the .NET runtime is attempting to dynamically cast an object to another type.
My questions:
- Am I correct?
- Is there some other way to do this?
By the way, the full application is that I'm using Delegate.DynamicInvoke()
to call a function that takes a MyDateTime
parameter, and the type of the argument I'm passing to DynamicInvoke
is a long.
回答1:
Am I correct?
Yes, yes you are. To be nit-picky, you should be saying "user-defined implicit conversion" rather than "implicit cast" -- a cast is (almost) always explicit. But your deduction that overload resolution chooses which user-defined conversion to call at compile time and not at run time is correct.
Is there some other way to do this?
Yes. In C# 4 if you type your "object" as "dynamic" then we start up the compiler again at runtime and re-perform all the analysis on the operands as though their compile-time types were the current run-time types. As you might imagine, this is not cheap, though we are very smart about caching and re-using the results should you do this in a tight loop.
回答2:
I know this is an older question but in case anyone else stumbles upon the same problem, this will compile and run fine:
long f = 5;
object g = f;
MyDateTime h = g as MyDateTime;
回答3:
Adding an explicit operator should work: http://msdn.microsoft.com/en-us/library/85w54y0a(VS.80).aspx
来源:https://stackoverflow.com/questions/35509502/why-are-implicit-type-conversion-operators-not-dynamically-usable-at-runtime-in