如何创建命名引用类型的元组?
How to create named reference-type tuples?
以下行创建一个名为 ValueTuple
的文件:
var tuple = (a:1, b:2, c:3, d:4, e:5, f:6);
值类型无法有效传递。 C#7
是否提供了创建 Tuple
类型命名元组的方法?
如果你的意思是如果有办法将其他名称附加到 System.Tuple<...>
个实例的属性,不,没有。
根据您想要它的原因,您可以通过使用 TupleExtensions 中的 ToValueTuple
重载将 System.Tuple<...>
实例转换为 System.ValueTuple<...>
实例并返回使用ToTuple
过载。
如果您真的不需要元组,可以使用 Deconstruct
重载或 var (v1, .., vn) = tuple
解构语法将它们解构为离散变量。
不确定是什么问题;一切都按我预期的方式进行,因为我通过 out、ref 和新的 ref locals 传递了新的 ValueTuple<T>
.
我正在使用 .NET 4.7 并将我的 C#7 编译器设置为 "latest" .csproj
设置 "Advanced..." 按钮。
演示函数(及数据):
static (int, int) g = (1, 2);
static void SetValues(int a, int b, ref (int, int) tt) => tt = (a, b);
static void SetValuesOut(int a, int b, out (int, int) tt) => tt = (a, b);
static ref (int, int) GetKnownTuple() => ref g;
static ref (int, int) SelectRef(
int ix,
ref (int, int) x,
ref (int, int) y,
ref (int, int) z)
{
if (ix == 0) return ref x;
if (ix == 1) return ref y;
return ref z;
}
用法示例:
static void demo_usages() {
/// use 'ref return' to initialize a new 'ref local' tuple 'aa'
ref (int, int) aa = ref GetKnownTuple();
/// or use the same function without 'ref' to create a local COPY 'bb'
var bb = GetKnownTuple();
/// use 'ref' parameter to modify values of local copy 'bb' ('aa/g' are not altered)
SetValues(3, 4, ref bb);
/// deconstruction of 'ref local' tuple; reads values from referent 'g' (1, 2)
(int x, int y) = aa;
/// 'ref local' reference to a local tuple copy
ref (int, int) dd = ref bb;
/// use 'out' parameter to construct a new (non-'ref') local tuple 'cc'
SetValuesOut(y, x, out (int, int) cc);
/// ...or use 'out' with 'ref local' to wholly replace existing referent ('g' here)
SetValuesOut(5, 6, out aa);
/// 'ref return' function can also be used as assignment l-value...
GetKnownTuple() = (7, 8);
/// ('aa/g' are altered; locals 'bb' and 'cc' remain unchanged)
/// ...or assign a referent via 'ref local' variable (changes 'g' again)
aa = (9, 10);
/// conditional assignment via 'ref return' (changes 'g' again)
SelectRef(0, ref aa, ref bb, ref cc) = (11, 12);
}
很明显,还有更多的可能,但由于 OP 的问题没有涉及太多具体的进一步要求,因此无法在此处显示所有内容。
以下行创建一个名为 ValueTuple
的文件:
var tuple = (a:1, b:2, c:3, d:4, e:5, f:6);
值类型无法有效传递。 C#7
是否提供了创建 Tuple
类型命名元组的方法?
如果你的意思是如果有办法将其他名称附加到 System.Tuple<...>
个实例的属性,不,没有。
根据您想要它的原因,您可以通过使用 TupleExtensions 中的 ToValueTuple
重载将 System.Tuple<...>
实例转换为 System.ValueTuple<...>
实例并返回使用ToTuple
过载。
如果您真的不需要元组,可以使用 Deconstruct
重载或 var (v1, .., vn) = tuple
解构语法将它们解构为离散变量。
不确定是什么问题;一切都按我预期的方式进行,因为我通过 out、ref 和新的 ref locals 传递了新的 ValueTuple<T>
.
我正在使用 .NET 4.7 并将我的 C#7 编译器设置为 "latest" .csproj
设置 "Advanced..." 按钮。
演示函数(及数据):
static (int, int) g = (1, 2);
static void SetValues(int a, int b, ref (int, int) tt) => tt = (a, b);
static void SetValuesOut(int a, int b, out (int, int) tt) => tt = (a, b);
static ref (int, int) GetKnownTuple() => ref g;
static ref (int, int) SelectRef(
int ix,
ref (int, int) x,
ref (int, int) y,
ref (int, int) z)
{
if (ix == 0) return ref x;
if (ix == 1) return ref y;
return ref z;
}
用法示例:
static void demo_usages() {
/// use 'ref return' to initialize a new 'ref local' tuple 'aa'
ref (int, int) aa = ref GetKnownTuple();
/// or use the same function without 'ref' to create a local COPY 'bb'
var bb = GetKnownTuple();
/// use 'ref' parameter to modify values of local copy 'bb' ('aa/g' are not altered)
SetValues(3, 4, ref bb);
/// deconstruction of 'ref local' tuple; reads values from referent 'g' (1, 2)
(int x, int y) = aa;
/// 'ref local' reference to a local tuple copy
ref (int, int) dd = ref bb;
/// use 'out' parameter to construct a new (non-'ref') local tuple 'cc'
SetValuesOut(y, x, out (int, int) cc);
/// ...or use 'out' with 'ref local' to wholly replace existing referent ('g' here)
SetValuesOut(5, 6, out aa);
/// 'ref return' function can also be used as assignment l-value...
GetKnownTuple() = (7, 8);
/// ('aa/g' are altered; locals 'bb' and 'cc' remain unchanged)
/// ...or assign a referent via 'ref local' variable (changes 'g' again)
aa = (9, 10);
/// conditional assignment via 'ref return' (changes 'g' again)
SelectRef(0, ref aa, ref bb, ref cc) = (11, 12);
}
很明显,还有更多的可能,但由于 OP 的问题没有涉及太多具体的进一步要求,因此无法在此处显示所有内容。