Can you hack this out? Hint #1
Here is another challenge, smaller, this time, which can lead you the right path. And yes, it is a screwy one.
All you have to do is make the following assertion fail.
public class Program
{
private static void Main(string[] args)
{
CanThisHappen<MyFunnyType>();
}
public static void CanThisHappen<T>() where T : class, new()
{
var instnace = new T();
Debug.Assert(instnace != null,"How did we break the CLR?");
}
}
The rules are simple, you are not allowed to do anything outside the current process. That means that profiling API, post compilation assembly rewrite, etc are forbidden. Anything else is a fair game.
I will let you know that I can make the assertion fail in 4 lines of code :-)
Comments
perhaps like this:
public class Program {
<myfunnytype();
<t() where T : class, new() {
internal class MyFunnyType {
}
Hazzik,
That would work, yes, but that doesn't match the challenge that I set.
Can we modify CanThisHappen method of program?
Hazzik,
No :-)
class MyFunnyTypeAttribute : ProxyAttribute {
}
[MyFunnyType] class MyFunnyType : ContextBoundObject{}
Marc,
:-)
Yeah.
Once the previous hack was solved, this is pretty easy.
Do you mean to break
var instnace = new <whatever;
object.ReferenceEquals(instnace, null) == false?
Dennis,
Yes.
Damn, thats a NASTY solution :S
I did not know that ProxyAttribute exists :)
It opens so many possibilities!!!
Indeed - pure evil; and definitely worthy of an update to my similar corner-case on stackoverflow: http://stackoverflow.com/questions/194484#194671
Apparently this will do the trick:
Reshef,
Try that, it won't work :-)
Right. When creating the object with new T() somehow the type is unknown and it won't call the != operator. Generics oddity...
@Reshef - it isn't that the T is unknown; it is that the operator can't be resolved via static analysis (which it must) to a single implementation. Similar to how +-*/ don't work (unless you cheat, like in MiscUtil's Operator class). I suspect there is some scenarios (involving subclassing and a constraint like T : SomeType) where it /would/ pick up the operator, but that ("T : SomeType") isn't in the question.
Looks like this would work.
public class InterceptionProxy : RealProxy
}
I've used a programming language in which you can return a value from a constructor, even null. Insanity :)
Cool post, I hate to say but I think you misspelled 'instance' as 'instnace' in your code example.
Peace!
Ooh, nice solution. I was thinking about this:
using MyFunnyType = System.Nullable <int;
As far as I recall, Nullable structs are not applicable for the "struct" constraint (which is actually defined as "non-nullable value type"), so I guess they might be applicable for the "class" constraint. I'm probably wrong, but it'd be a nice solution.
Comment preview