Недавно я бродил, можно ли сравнить структуры по ссылке.Поскольку чтение структурной переменной создает копию этой переменной, сравнение стандартных структур по ссылке кажется невозможным.Однако использование C # 7 ref
s будет иметь больше смысла.
Я определил 4 переменные
MyStruct foo = new MyStruct(){SomeInt = 1};
ref MyStruct refFoo = ref foo;
MyStruct bar = new MyStruct() { SomeInt = 2 };
ref MyStruct refBar = ref foo;
Учитывая, что MyStruct является стандартной структурой
struct MyStruct
{
public int SomeInt { get; set; }
}
Когда я пытаюсьэто: var comparison1 = ReferenceEquals(refFoo, refBar);
, я получаю предупреждение о том, что значение всегда ложно, так как я передаю типы значений.
Если я использую C # 7 ref struct
вместо
ref struct MyStruct
{
public int SomeInt { get; set; }
}
Когда я пытаюсь это сделать: var comparison1 = ReferenceEquals(refFoo, refBar);
, я получаю ошибку компиляции , говорящую, что MyStruct
нельзя назначить типу параметра object
.То же самое, если я попытаюсь: var comparison1 = ReferenceEquals(foo, bar);
Последний случай, когда MyStruct
равен ref struct
, но переменные refFoo
и refBar
объявлены без ref
.(Я получаю ту же ошибку, что и во втором случае)
static void Main(string[] args)
{
MyStruct foo = new MyStruct(){SomeInt = 1};
MyStruct refFoo = foo;
MyStruct bar = new MyStruct() { SomeInt = 2 };
MyStruct refBar = foo;
var comparison1 = ReferenceEquals(refFoo, refBar);
}
ref struct MyStruct
{
public int SomeInt { get; set; }
}
- Итак, есть ли какой-нибудь хитрый способ сравнения структур по ссылке?
- Дополнительный вопрос: почему только второйи 3-й пример дает мне ошибку компиляции?