Элегантно исправить CS1612 для типа значения в интерфейсе?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Элегантно исправить CS1612 для типа значения в интерфейсе?

Сообщение Anonymous »

У меня есть несколько несвязанных типов, которые имеют одни и те же члены, например. позиция, ускорение и т. д.
Естественно, я подумал о том, чтобы эти типы реализовывали интерфейс.
Но с помощью интерфейсов можно объявлять только свойства, не поля...
Проблема:
Поскольку это векторы типов значений, я не могу изменить .X больше не похоже на поле:
Невозможно изменить возвращаемое значение «выражения», поскольку оно не является переменной
Решение 1:
Создайте переменную из вектора, измените ее, присвойте обратно свойству.
Это работает, но мне придется обновить тонны кода, чтобы это было непрактично...
Решение 2:
Используйте векторный класс ссылочного типа.. . работает, но это уже не тип значения!
Есть веская причина, почему векторные типы в большинстве API создаются как типы значений...
Пример кода:

Код: Выделить всё

using System;
using UnityEngine;

public interface IEntity
{
public Vector3Int Position { get; set; } // ideal vector, a value type

public Vector3IntRef PositionRef { get; set; } // attempt to fix the problem
}

public class Entity : IEntity
{
public Vector3Int Position { get; set; }

public Vector3IntRef PositionRef { get; set; } = new();
}

public class Test
{
public Test()
{
var entity = new Entity();

// Problem, cannot modify .x in vector because it is a property:

entity.Position.x = 4; // CS1612 Cannot modify the return value of 'Entity.Position' because it is not a variable

// Possible fix but will be a pain to update all places to do like this:

var position = entity.Position;

position.x = 4;

entity.Position = position;

// Possible fix using a reference type:

entity.PositionRef.X = 4; // now that works

entity.PositionRef = Vector3Int.zero; // operator works but creates a new instance...
}
}

public sealed class Vector3IntRef
{
public int X { get; set; }

public int Y { get; set; }

public int Z { get; set; }

public static implicit operator Vector3Int(Vector3IntRef v)
{
return new Vector3Int(v.X, v.Y, v.Z);
}

public static implicit operator Vector3IntRef(Vector3Int v)
{
return new Vector3IntRef { X = v.x, Y = v.y, Z = v.z };
}
}
Вопрос:
Можете ли вы предложить альтернативный шаблон, который я, возможно, пропустил?
(учитывая, что будет много мест для обновления, т. е. минимизации шаблонного кода)

Подробнее здесь: https://stackoverflow.com/questions/781 ... -interface
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»