UPDATE: The screenshot below was lost to the big /dev/null in a server move, so you have to use your imagination.
Can you make a property in C# that you can only add to and remove from? That is what an event does, but that only works with delegates. You can (ab)use an implicit conversion to get something like this:
It works – I wouldn’t recommend using it in production code though… Maybe more interresting is what would happen if we modified the CIL for an event to accept a non delegate type. Well let’s try it and see what happens!
The original C# code:
Relevant parts of the generated CIL code:
Let us replace “System.Action” with “System.Object” and see what happens. Running ilasm:
C:\Users\poizan\Documents\Visual Studio 2010\Projects\Test>ilasm /DLL EventTest.il Microsoft (R) .NET Framework IL Assembler. Version 4.0.30319.1 Copyright (c) Microsoft Corporation. All rights reserved. Assembling 'EventTest.il' to DLL --> 'EventTest.dll' Source file is ANSI Assembled method EventTest.EventTester::get_TestList Assembled method EventTest.EventTester::add_TestEvent Assembled method EventTest.EventTester::remove_TestEvent Assembled method EventTest.EventTester::.ctor Creating PE file Emitting classes: Class 1: EventTest.EventTester Emitting fields and methods: Global Class 1 Fields: 1; Methods: 4; Resolving local member refs: 7 -> 7 defs, 0 refs, 0 unresolved Emitting events and properties: Global Class 1 Events: 1; Props: 1; Resolving local member refs: 0 -> 0 defs, 0 refs, 0 unresolved Writing PE file Operation completed successfully
So far so good. Let us try to use it:
It builds successfully. And running it:
And that is one more thing the C# compiler supports just fine but refuses to create.