NH-3675

https://nhibernate.jira.com/browse/NH-3675
Initial implementation with unit tests
It is managed code... it is not C++:)

```csharp
    public int I1(int i){return i++;}
    public int I2(int i){return ++i;}
```
```il
    .method public hidebysig 
        instance int32 I1 (
            int32 i
        ) cil managed 
    {
        // Method begins at RVA 0x2095
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.1
        IL_0001: dup
        IL_0002: ldc.i4.1
        IL_0003: add
        IL_0004: starg.s i
        IL_0006: ret
    } // end of method C::I1

    .method public hidebysig 
        instance int32 Inc2 (
            int32 i
        ) cil managed 
    {
        // Method begins at RVA 0x209d
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.1
        IL_0001: ldc.i4.1
        IL_0002: add
        IL_0003: dup
        IL_0004: starg.s i
        IL_0006: ret
    } // end of method C::Inc2
```

So basically code is the same. Because CLR is a state machine so it always dups a variable on stack.