给出一些扩展方法:
public static TO ConvertValue<TI, TO>(TI value) => (TO)Convert.ChangeType(value, typeof(TO));
public static void Deconstruct<TI, TO1, TO2>(this IEnumerable<TI> src, out TO1 p1, out TO2 p2) {
var e = src.GetEnumerator();
p1 = e.MoveNext() ? ConvertValue<TI,TO1>(e.Current) : default(TO1);
p2 = e.MoveNext() ? ConvertValue<TI,TO2>(e.Current) : default(TO2);
}
为什么C#编译器无法在此处推断出Deconstruct
的类型:
(double p1, int p2) = new int[] { 1, 2, 3, 4 };
但是在这里推断类型没有问题吗?
Ext.Deconstruct(new int[] { 1, 2, 3 }, out int p3, out double p4);
答案 0 :(得分:1)
来自deconstructions (C# 7.0) documentation:
这些参数都不是类型参数。
分辨率相当于输入rhs.Deconstruct(输出var x1,out var x2,...);用适当数量的参数来解构 成。它基于正常的重载分辨率。这意味着rhs 不能是动态的,也没有解构的任何参数 method可以是类型参数。解构(出T x1,出T x2) 方法将无法找到。