Следует изменить содержимое строки, например это вызывает исключение?

Рассмотрим следующий код:

using System;
using System.Runtime.InteropServices;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            const string test = "ABCDEF"; // Strings are immutable, right?
            char[] chars = new StringToChar{str=test}.chr;
            chars[0] = 'X';

            // On an x32 release or debug build or on an x64 debug build, 
            // the following prints "XBCDEF".
            // On an x64 release build, it prints "ABXDEF".
            // In both cases, we have changed the contents of 'test' without using
            // any 'unsafe' code...

            Console.WriteLine(test);
        }
    }

    [StructLayout(LayoutKind.Explicit)]
    public struct StringToChar
    {
        [FieldOffset(0)]
        public string str;
        [FieldOffset(0)]
        public char[] chr;
    }
}

Запустив этот код, мы можем изменить содержимое строки без возникновения исключения. Для этого нам не нужно было объявлять небезопасный код. Этот код явно очень хитрый!

У меня простой вопрос: как вы думаете, должно ли быть вызвано исключение из-за кода выше?

[РЕДАКТИРОВАТЬ1: Обратите внимание, что другие люди пробовали это для меня, и некоторые люди получают другие результаты - что не слишком удивительно, учитывая мерзость того, что я делаю ...;)]

[EDIT2: обратите внимание, что я использую Visual Studio 2010 в Windows 7 Ultimate 64 bit]

[EDIT3: Сделал тестовую строку const, чтобы сделать ее еще более изворотливой!]

5
задан Matthew Watson 23 December 2010 в 14:36
поделиться