Вот небольшой фрагмент кода, который демонстрирует базовое представление bool
, на текущей платформе, где бы она ни выполнялась :
var x = new NotAGoodIdea();
x.TheBool = true;
Console.WriteLine(x.TheByte); // 1
x.TheBool = false;
Console.WriteLine(x.TheByte); // 0
// ...
[StructLayout(LayoutKind.Explicit)]
public struct NotAGoodIdea
{
[FieldOffset(0)]
public bool TheBool;
[FieldOffset(0)]
public byte TheByte;
}
(Обратите внимание, что хотя 1
, по-видимому, представляет true
, а 0
, по-видимому, представляет false
, это всего лишь деталь реализации. Вы не должны полагаться на эту деталь или предполагать, что она останется согласованной в разных версиях и / или реализациях, или даже в том, что текущая платформа всегда использует одно и то же согласованное представление.)
EDIT ...
Спецификация ECMA CLI (раздел III, раздел 1.1.2) достаточно ясна в отношении допустимых представлений типа Boolean
:
1.1.2 Тип логических данных
Логический тип CLI занимает 1 байт
объем памяти. Битовый паттерн из всех нулей
обозначает значение false. Немного
шаблон с любым одним или несколькими установленными битами
(аналог ненулевого целого числа)
обозначает значение true.
Похоже, что текущий Microsoft CLR придерживается спецификации ECMA, разрешающей множественное представление true
. В следующем примере отображается одна строка «False» (для 0
), за которой следуют 255 строк «True»:
// re-use the NotAGoodIdea struct from the previous example
var x = new NotAGoodIdea();
for (int i = 0; i < 256; i++ )
{
x.TheByte = (byte)i;
Console.WriteLine(x.TheBool);
}