C# 'is' type check on struct - odd .NET 4.0 x86 optimization behavior
Since upgrading to VS2010 I'm getting some very strange behavior with the 'is' keyword.

The program below (test.cs) outputs True when compiled in debug mode (for x86) and False when compiled with optimizations on (for x86). Compiling all combinations in x64 or AnyCPU gives the expected result, True.

All combinations of compiling under .NET 3.5 give the expected result, True.

I'm using the batch file below (runtest.bat) to compile and test the code using various combinations of compiler .NET framework.

- Has anyone else seen these kind of problems under .NET 4.0?
- Does everyone else see the same behavior as me on their computer when running runtests.bat?
- #@$@#$??
- Is there a fix for this?

### test.cs ###

    using System;

    public class Program
    {
        public static bool IsGuid(object item)
        {
            return item is Guid;
        } 

        public static void Main()
        {
            Console.Write(IsGuid(Guid.NewGuid()));
        }
    }

### runtest.bat ###

    @echo off
    
    rem Usage:
    rem   runtest         -- runs with csc.exe x86 .NET 4.0
    rem   runtest 64      -- runs with csc.exe x64 .NET 4.0
    rem   runtest v3.5    -- runs with csc.exe x86 .NET 3.5
    rem   runtest v3.5 64 -- runs with csc.exe x64 .NET 3.5
    
    set version=v4.0.30319
    set platform=Framework
    
    for %%a in (%*) do (
      if "%%a" == "64" (set platform=Framework64)
      if "%%a" == "v3.5" (set version=v3.5)
    )
    
    echo Compiler: %platform%\%version%\csc.exe
    set csc="C:\Windows\Microsoft.NET\%platform%\%version%\csc.exe"
    
    set make=%csc% /nologo /nowarn:1607 test.cs
    rem CS1607: Referenced assembly targets a different processor
    rem This happens if you compile for x64 using csc32, or x86 using csc64
    
    %make% /platform:x86
    test.exe
    echo  =^> x86
    
    %make% /platform:x86 /optimize
    test.exe
    echo  =^> x86 (Optimized)
    
    %make% /platform:x86 /debug
    test.exe
    echo  =^> x86 (Debug)
    
    %make% /platform:x86 /debug /optimize
    test.exe
    echo  =^> x86 (Debug + Optimized)
    
    %make% /platform:x64
    test.exe
    echo  =^> x64
    
    %make% /platform:x64 /optimize
    test.exe
    echo  =^> x64 (Optimized)
    
    %make% /platform:x64 /debug
    test.exe
    echo  =^> x64 (Debug)
    
    %make% /platform:x64 /debug /optimize
    test.exe
    echo  =^> x64 (Debug + Optimized)
    
    %make% /platform:AnyCPU
    test.exe
    echo  =^> AnyCPU
    
    %make% /platform:AnyCPU /optimize
    test.exe
    echo  =^> AnyCPU (Optimized)
    
    %make% /platform:AnyCPU /debug
    test.exe
    echo  =^> AnyCPU (Debug)
    
    %make% /platform:AnyCPU /debug /optimize
    test.exe
    echo  =^> AnyCPU (Debug + Optimized)

### Test Results ###
When running the runtest.bat I get the following results on my Win7 x64 install.

    > runtest 32 v4.0
    Compiler: Framework\v4.0.30319\csc.exe
    False => x86
    False => x86 (Optimized)
    True => x86 (Debug)
    False => x86 (Debug + Optimized)
    True => x64
    True => x64 (Optimized)
    True => x64 (Debug)
    True => x64 (Debug + Optimized)
    True => AnyCPU
    True => AnyCPU (Optimized)
    True => AnyCPU (Debug)
    True => AnyCPU (Debug + Optimized)

    > runtest 64 v4.0
    Compiler: Framework64\v4.0.30319\csc.exe
    False => x86
    False => x86 (Optimized)
    True => x86 (Debug)
    False => x86 (Debug + Optimized)
    True => x64
    True => x64 (Optimized)
    True => x64 (Debug)
    True => x64 (Debug + Optimized)
    True => AnyCPU
    True => AnyCPU (Optimized)
    True => AnyCPU (Debug)
    True => AnyCPU (Debug + Optimized)

    > runtest 32 v3.5
    Compiler: Framework\v3.5\csc.exe
    True => x86
    True => x86 (Optimized)
    True => x86 (Debug)
    True => x86 (Debug + Optimized)
    True => x64
    True => x64 (Optimized)
    True => x64 (Debug)
    True => x64 (Debug + Optimized)
    True => AnyCPU
    True => AnyCPU (Optimized)
    True => AnyCPU (Debug)
    True => AnyCPU (Debug + Optimized)

    > runtest 64 v3.5
    Compiler: Framework64\v3.5\csc.exe
    True => x86
    True => x86 (Optimized)
    True => x86 (Debug)
    True => x86 (Debug + Optimized)
    True => x64
    True => x64 (Optimized)
    True => x64 (Debug)
    True => x64 (Debug + Optimized)
    True => AnyCPU
    True => AnyCPU (Optimized)
    True => AnyCPU (Debug)
    True => AnyCPU (Debug + Optimized)

## tl;dr ##
C# 'is' type check on struct - odd .NET 4.0 x86 optimization behavior
===

Since upgrading to VS2010 I'm getting some very strange behavior with the 'is' keyword.

The program below (test.cs) outputs True when compiled in debug mode (for x86) and False when compiled with optimizations on (for x86). Compiling all combinations in x64 or AnyCPU gives the expected result, True.

All combinations of compiling under .NET 3.5 give the expected result, True.

I'm using the batch file below (runtest.bat) to compile and test the code using various combinations of compiler .NET framework.

- Has anyone else seen these kind of problems under .NET 4.0?
- Does everyone else see the same behavior as me on their computer when running runtests.bat?
- #@$@#$??
- Is there a fix for this?

### test.cs ###

    using System;

    public class Program
    {
        public static bool IsGuid(object item)
        {
            return item is Guid;
        } 

        public static void Main()
        {
            Console.Write(IsGuid(Guid.NewGuid()));
        }
    }

### runtest.bat ###

    @echo off
    
    rem Usage:
    rem   runtest         -- runs with csc.exe x86 .NET 4.0
    rem   runtest 64      -- runs with csc.exe x64 .NET 4.0
    rem   runtest v3.5    -- runs with csc.exe x86 .NET 3.5
    rem   runtest v3.5 64 -- runs with csc.exe x64 .NET 3.5
    
    set version=v4.0.30319
    set platform=Framework
    
    for %%a in (%*) do (
      if "%%a" == "64" (set platform=Framework64)
      if "%%a" == "v3.5" (set version=v3.5)
    )
    
    echo Compiler: %platform%\%version%\csc.exe
    set csc="C:\Windows\Microsoft.NET\%platform%\%version%\csc.exe"
    
    set make=%csc% /nologo /nowarn:1607 test.cs
    rem CS1607: Referenced assembly targets a different processor
    rem This happens if you compile for x64 using csc32, or x86 using csc64
    
    %make% /platform:x86
    test.exe
    echo  =^> x86
    
    %make% /platform:x86 /optimize
    test.exe
    echo  =^> x86 (Optimized)
    
    %make% /platform:x86 /debug
    test.exe
    echo  =^> x86 (Debug)
    
    %make% /platform:x86 /debug /optimize
    test.exe
    echo  =^> x86 (Debug + Optimized)
    
    %make% /platform:x64
    test.exe
    echo  =^> x64
    
    %make% /platform:x64 /optimize
    test.exe
    echo  =^> x64 (Optimized)
    
    %make% /platform:x64 /debug
    test.exe
    echo  =^> x64 (Debug)
    
    %make% /platform:x64 /debug /optimize
    test.exe
    echo  =^> x64 (Debug + Optimized)
    
    %make% /platform:AnyCPU
    test.exe
    echo  =^> AnyCPU
    
    %make% /platform:AnyCPU /optimize
    test.exe
    echo  =^> AnyCPU (Optimized)
    
    %make% /platform:AnyCPU /debug
    test.exe
    echo  =^> AnyCPU (Debug)
    
    %make% /platform:AnyCPU /debug /optimize
    test.exe
    echo  =^> AnyCPU (Debug + Optimized)

### Test Results ###
When running the runtest.bat I get the following results on my Win7 x64 install.

    > runtest 32 v4.0
    Compiler: Framework\v4.0.30319\csc.exe
    False => x86
    False => x86 (Optimized)
    True => x86 (Debug)
    False => x86 (Debug + Optimized)
    True => x64
    True => x64 (Optimized)
    True => x64 (Debug)
    True => x64 (Debug + Optimized)
    True => AnyCPU
    True => AnyCPU (Optimized)
    True => AnyCPU (Debug)
    True => AnyCPU (Debug + Optimized)

    > runtest 64 v4.0
    Compiler: Framework64\v4.0.30319\csc.exe
    False => x86
    False => x86 (Optimized)
    True => x86 (Debug)
    False => x86 (Debug + Optimized)
    True => x64
    True => x64 (Optimized)
    True => x64 (Debug)
    True => x64 (Debug + Optimized)
    True => AnyCPU
    True => AnyCPU (Optimized)
    True => AnyCPU (Debug)
    True => AnyCPU (Debug + Optimized)

    > runtest 32 v3.5
    Compiler: Framework\v3.5\csc.exe
    True => x86
    True => x86 (Optimized)
    True => x86 (Debug)
    True => x86 (Debug + Optimized)
    True => x64
    True => x64 (Optimized)
    True => x64 (Debug)
    True => x64 (Debug + Optimized)
    True => AnyCPU
    True => AnyCPU (Optimized)
    True => AnyCPU (Debug)
    True => AnyCPU (Debug + Optimized)

    > runtest 64 v3.5
    Compiler: Framework64\v3.5\csc.exe
    True => x86
    True => x86 (Optimized)
    True => x86 (Debug)
    True => x86 (Debug + Optimized)
    True => x64
    True => x64 (Optimized)
    True => x64 (Debug)
    True => x64 (Debug + Optimized)
    True => AnyCPU
    True => AnyCPU (Optimized)
    True => AnyCPU (Debug)
    True => AnyCPU (Debug + Optimized)

## tl;dr ##