使用Deconstruct元组赋值扩展方法键入推理

时间:2017-10-19 23:29:33

标签: c# tuples extension-methods type-inference

给出一些扩展方法:

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);

1 个答案:

答案 0 :(得分:1)

来自deconstructions (C# 7.0) documentation

这些参数都不是类型参数。

  

分辨率相当于输入rhs.Deconstruct(输出v​​ar x1,out   var x2,...);用适当数量的参数来解构   成。它基于正常的重载分辨率。这意味着rhs   不能是动态的,也没有解构的任何参数   method可以是类型参数。解构(出T x1,出T x2)   方法将无法找到。