Кортеж неизменен, поэтому вы не можете изменять его значения. Когда у вас есть неизменяемые объекты, способ изменить их - это вернуть новый объект с измененными желаемыми свойствами. Поэтому, если вы хотите придерживаться кортежей, вы можете сделать что-то вроде этого:
public static class TupleExtensions {
public static Tuple<T1, T2, T3>
WhereItem3Is<T1, T2, T3>(this Tuple<T1, T2, T3> self, T3 newValue) {
return Tuple.Create(self.Item1, self.Item2, newValue);
}
// other methods for Tuple<,,> or other Tuples...
}
И используйте это так:
var t = Tuple.Create(1, 2, 3);
// ...
t = t.WhereItem3Is(4);
Но немного болезненно писать все эти методы. Так что если вам нужно много из них, лучше просто сделайте это:
var t = Tuple.Create(1, 2, 3);
t = Tuple.Create(t1.Item1, t1.Item2, 4);
Вы могли бы даже иметь тип оболочки, который вы бы использовали для ссылки на кортеж из разных мест в вашем коде, чтобы можно было увидеть любые «изменения»:
var t = Tuple.Create(1, 2, 3);
var r = new Ref<Tuple<int, int, int>>(t);
// share r ...
r.Value = Tuple.Create(r.Value.Item1, r.Value.Item2, 4);
...
public class Ref<T> {
public T Value { get; set; }
public Ref(T value) { Value = value; }
}
Все это, однако, кажется очень неловким . Может быть, вы могли бы лучше объяснить существующую проблему существенную , чтобы получить лучшие ответы. Возможно, вам действительно не нужен кортеж, просто что-то более специфичное для вашего домена.