c# - 隐式输出参数

标签 c# generics out implicit-typing

this question 类似,我决定看看是否可以将方法中的 out 参数提取到隐式类型的变量中,而无需定义类型。我理想的解决方案看起来像这样:

var result = LiftOutParam((out p1, out p2, out p3) => {
    return CallMyMethod(i1, i2, out p1, out p2, out p3);
});
var o1 = result.Item1;
var o2 = result.Item2;
var o3 = result.Item3;
var returnValue = result.Item4;

在这种情况下,CallMyMethod 有 2 个普通输入变量、3 个 out 参数和一个返回值。我想让编译器根据语义自动判断o1o2o3returnValue的类型传递给 LiftOutParam 的委托(delegate)。所以我为输出参数的每个组合创建了一些帮助委托(delegate)和方法。下面是 3 个 out 参数的示例:

public delegate TReturn Lift<T1, T2, T3, TReturn>(
    out T1 o1, out T2 o2, out T3 o3);

public static Tuple<T1, T2, T3, TReturn> LiftOutParam<T1, T2, T3, TReturn>(
    Lift<T1, T2, T3, TReturn> Lift) {

    T1 o1;
    T2 o2;
    T3 o3;
    TReturn ret = Lift(out o1, out o2, out o3);
    return new Tuple<T1, T2, T3, TReturn>(o1, o2, o3, ret);
}

理论上,编译器应该能够确定类型T1T2T3TReturn 基于委托(delegate)的语义 (out p1, out p2, out p3) => { return CallMyMethod(i1, i2, out p1, out p2, out p3); }。但是,除非我在委托(delegate)中指定每个 out 参数的类型,否则上述代码不会编译。

有没有办法完成我想要完成的事情?要编写一个通用的辅助方法,可以将 out 参数的值提取到隐式类型的局部变量中,而无需在任何地方显式定义类型?

最佳答案

这里有两个问题:

  1. 当 lambda 表达式的一个或多个参数需要 refout 修饰符时,语法要求您必须 为 lambda 表达式的所有参数指定类型。这是一个语法问题,无论编译器是否能够推断出类型,它都适用。

  2. 必须有一个类型来推断。如果你有方法

    void MyMethod<T>(Action<T> action)
    {
    }
    

    那么你不能像这样调用这个方法:MyMethod(t => { }); 因为在这种情况下没有办法推断出 T 是什么。 T 必须被推断为一种特定类型。这可能是一种类型,它依赖于调用 MyMethod 时范围内的另一个通用参数。

关于c# - 隐式输出参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14345735/

相关文章:

java - Java 中未经检查的赋值警告

javascript - 如何为此设置超时?

c# - Quartz.net 在 UTC 时间创建每日计划

c# - 在 WP7 Silverlight 应用程序中导航时将复杂对象传递到页面

c# - 我怎样才能删除这个网格中多余的瓷砖?

c# - C# 中的 'out' 修饰符

c# - Task.Factory.StartNew(someMethod(withParam)).continueWith(sameMethod(differentParam)).Wait()

c# - 从 DbContext 检索 DbSet<T> 的通用方法

java - 泛型:为什么实现的集合返回一个对象而不是指定的类型?