Извините, что не использовал комментарий, я не думаю, что он подойдет.
Джон, это не настоящая реализация, я просто пытаюсь получить более глубокое понимание структур, так что меня не волнует реализация изменяемых структур:)
Во всяком случае, я не уверен, что вы правы. Рассмотрим этот код, он почти такой же, как в первом примере:
public struct SomeStruct
{
public int PublicProperty { get; set; }
public int PublicField;
public SomeStruct(int propertyValue, int fieldValue)
: this()
{
PublicProperty = propertyValue;
PublicField = fieldValue;
}
public int GetProperty()
{
return PublicProperty;
}
public void SetProperty(int value)
{
PublicProperty = value;
}
}
class Program
{
static void Main(string[] args)
{
SomeStruct a = new SomeStruct(1, 1);
a.PublicProperty++;
a.SetProperty(a.GetProperty()+1);
}
}
Теперь, глядя на msil с помощью ildasm, я получаю следующее для метода Main:
.method private hidebysig static void Main (string [] args) управляемый cil
{
.entrypoint
// Code size 45 (0x2d)
.maxstack 3
.locals init ([0] valuetype ConsoleApplication1.SomeStruct a)
IL_0000: nop
IL_0001: ldloca.s a
IL_0003: ldc.i4.1
IL_0004: ldc.i4.1
IL_0005: call instance void ConsoleApplication1.SomeStruct::.ctor(int32,
int32)
IL_000a: nop
IL_000b: ldloca.s a
IL_000d: dup
IL_000e: call instance int32
ConsoleApplication1.SomeStruct :: get_PublicProperty ()
IL_0013: ldc.i4.1
IL_0014: add
IL_0015: call instance void
ConsoleApplication1.SomeStruct :: set_PublicProperty (int32)
IL_001a: nop
IL_001b: ldloca.s a
IL_001d: ldloca.s a
IL_001f: call instance int32 ConsoleApplication1.SomeStruct::GetProperty()
IL_0024: ldc.i4.1
IL_0025: add
IL_0026: call instance void ConsoleApplication1.SomeStruct::SetProperty(int32)
IL_002b: nop
IL_002c: ret
}
Прошу прощения за ужасное форматирование, я не уверен, как заставить его выглядеть нормально. В любом случае, надеюсь, вы видите, что последние 2 строки кода в основном методе фактически идентичны.
Поэтому я бы сказал, что из предыдущего поста эта строка:
a.OtherStruct.PublicProperty++;
Фактически идентичен строке после нее:
a.OtherStruct.SetProperty(a.OtherStruct.GetProperty() + 1);
И поэтому мне кажется, что первая строка не компилируется просто потому, что компилятор ее не поддерживает, а не потому, что она недопустима.
Что вы думаете?