An "is" operator puzzle, part one
It is possible for a program with some local variable x:
bool b = x is FooBar;
to assign true to b at runtime, even though there is no conversion, implicit or explicit, from x to FooBar allowed by the compiler! That is,
FooBar foobar = (FooBar)x;
would not be allowed by the compiler in that same program.
Can you create a program to demonstrate this fact? This is not a particularly hard puzzle but it does illustrate some of the subtleties of the "is" operator that we'll discuss in the next episode.
Comments
Anonymous
August 23, 2012
The comment has been removedAnonymous
August 23, 2012
We're having a fun time trying to solve this in the C# StackOverflow chat room. Thanks for the puzzle Eric!Anonymous
August 23, 2012
The comment has been removedAnonymous
August 23, 2012
Gah, Ignore that, I misread the problem.Anonymous
August 23, 2012
static void M<T>(T x) { bool b = x is FooBar; FooBar foobar = (FooBar)x; }Anonymous
August 23, 2012
The comment has been removedAnonymous
August 23, 2012
The comment has been removedAnonymous
August 23, 2012
I, too, tested my code in LINQPad. Just realized that it does not produce a compiler error, but a RuntimeBinderException exception at runtime.Anonymous
August 23, 2012
The comment has been removedAnonymous
August 23, 2012
The comment has been removedAnonymous
August 23, 2012
I think any developer who's attempted generic math has run into this: public void DoMath<T>(T value) { if (value is int) { DoIntMath((int)value); } }Anonymous
August 23, 2012
The comment has been removedAnonymous
August 23, 2012
Nope, forget it...it's an alias, thus the type is the same, and any cast/conversion would be allowed.Anonymous
August 23, 2012
var x = new TypedReference(); bool b = x is object; Console.WriteLine(b); object o = (object)x;Anonymous
August 23, 2012
Maybe this? class Program { static void Main(string[] args) { dynamic x = new FooBar(); bool b = x is FooBar; Console.WriteLine(b); Console.ReadLine(); } class FooBar { } }Anonymous
August 23, 2012
Eric, I can not wait to see a correct answer. Who is that lucky guy who guessed?Anonymous
August 24, 2012
int x = 0; bool b = x is FooBar; Console.WriteLine(b); FooBar foobar = (FooBar)x;Anonymous
August 24, 2012
namespace IsConsoleApplication { class Program { static void Main(string[] args) { var x = new object(); var b = x is FooBar; var fooBar = (FooBar)x; } class FooBar { } } } 'object' is compatible with 'FooBar', so b = true; but 'x' don't refer to a 'FooBar' when the type verification is performed in the type hierarchy.Anonymous
August 25, 2012
The comment has been removedAnonymous
August 25, 2012
I agree with Stuart (comment #1).Anonymous
August 26, 2012
The comment has been removed