Ответы других, касающиеся неизменяемости, конечно же, правильны и являются «фактической» причиной проблемы, с которой вы столкнулись.
Поскольку вы специально задали вопрос об основополагающей реализации (и, может быть, просто из любопытства),и в качестве ссылки на других, которые могут наткнуться на этот вопрос, вот еще некоторая информация на эту тему из Эрика Липперта :
". В .NET CLR заложены строкив памяти почти так же, как BSTR были реализованы в OLE Automation: как буфер памяти с выравниванием по словам, состоящий из четырехбайтового целого числа, задающего длину строки, за которым следуют символы строки в двухбайтовых кускахДанные UTF-16, за которыми следуют два нулевых байта. "
Обратите внимание на" довольно большую часть "здесь, однако сами BSTR также объясняются в блоге Эрика .
Имейте в виду, что все это должно рассматриваться как деталь реализации.И хотя это не должно волновать большинство из нас, оно может помочь при устранении проблем взаимодействия или в общем понимании.