C# 解构元组赋值扩展方法的类型推断

C# 解构元组赋值扩展方法的类型推断,c#,tuples,extension-methods,type-inference,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.GetEnumera

给出了一些扩展方法:

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);
}
但是推断出这里的类型没有问题吗

Ext.Deconstruct(new int[] {  1, 2, 3 }, out int p3, out double p4);
发件人:

所有参数都不能是类型参数

分辨率相当于键入rhs.Deconstruct(out var x1,out var x2,…);使用适当数量的参数进行解构 进入它基于正常过载分辨率。这意味着rhs 不能是动态的,并且解构的任何参数 方法可以是类型参数。解构(out T x1,out T x2) 将找不到方法


在C#7.0中,元组赋值是对rhs上的
Deconstruct
方法(可以是扩展方法)的隐式调用,其中元组项是
out
参数,当rhs不是元组时,
Deconstruct
方法。哦,我明白了。没有意识到这个特性。这看起来很简单,但它还说“.Net framework还包括一组System.Tuple类型。这些类型不被识别为C#Tuple,因此将依赖解构模式。这些解构方法将作为System.Tuple的扩展方法提供,最多可嵌套3个嵌套(即21个元素)。”这些方法是特例吗?我怀疑第一句话可能更有效。编译器需要能够推断类型参数,而无需查看解构左侧声明中的指定类型。这是有道理的。对于System.Tuple,所有泛型类型参数都可以从第一个Tuple参数推断出来。在本例中,编译器实际上需要左侧的类型来确定泛型类型参数是什么。例如
Ext.Deconstruct(新的int[]{1,2,3},out var p3,out var p4)也将无法编译。您是正确的。请看,类型是从第一个元组参数推断出来的。@mikez为什么你们认为这有意义?我认为包含任何特定类型的翻译都是最有意义的。无论如何,对于我的Perl解包实现来说,这太糟糕了。@NetMage我想从我读到的关于C#设计的内容来看,这是有道理的。作为一般规则,语言试图给每个表达式一个类型,并且信息向外流动。只有在某些非常特殊的情况下,它才会“向内”流动。这是因为“向内”流的计算成本很高,受难以理解的复杂规则控制,并且使错误报告变得困难。也就是说,编译器在类似的情况下(如lambda表达式)执行此操作。我只能推测,它被判定为“拥有美好”,可以在本案稍后添加。
Ext.Deconstruct(new int[] {  1, 2, 3 }, out int p3, out double p4);