【问题标题】:Tuple.Create : The type arguments for method cannot be inferred from the usageTuple.Create :方法的类型参数不能从用法中推断出来
【发布时间】:2019-02-17 11:35:13
【问题描述】:

我正在尝试使该方法返回一个元组:Tuple<DateTime?, DateTime?>

如果代码能够生成两种 DateTime 类型,我将使用Tuple.Create 创建一个返回语句:

public Tuple<DateTime?, DateTime?> GeTuple()
{
    if (something)
    {
        return Tuple.Create(startDate, endDate);
    }
    else
    {
        return Tuple.Create(null, null); //--> This line produce the error.
    }
}

但我收到以下错误:

方法 'Tuple.Create(T1, T2)' 的类型参数不能是 从用法推断。尝试明确指定类型参数。

【问题讨论】:

  • 编译器无法查看Tuple.Create(null, null) 并告诉您您打算创建Tuple&lt;DateTime?, DateTime?&gt;。使用new Tuple&lt;DateTime?, DateTime?&gt;(null, null)Tuple.Create((DateTime?)null, (DateTime?)null)
  • Tnx,它有效..
  • 将其扩展为完整答案

标签: c# tuples


【解决方案1】:

编译器无法查看Tuple.Create(null, null) 并告诉您您打算创建Tuple&lt;DateTime?, DateTime?&gt;。然后从返回 Tuple&lt;DateTime?, DateTime?&gt; 的方法返回它的事实并不重要:编译器不会考虑这一点。

使用其中一种:

new Tuple<DateTime?, DateTime?>(null, null)

Tuple.Create((DateTime?)null, (DateTime?)null)

【讨论】:

    【解决方案2】:

    作为@canton7 回答的补充回答,我只想补充一点,C# 7 引入了一个名为 ValueTuple 的新结构,它得到了编译器的明确支持:

    所以你的代码可以利用它如下:

    public (DateTime?, DateTime?) GeTuple() => boolean-expression ? (startDate, endDate) : (default(DateTime?), default(DateTime?));
    

    注意 (DateTime?, DateTime?) 只是语法糖:

    System.ValueTuple<DateTime?, DateTime?>.
    

    这个Stackoveflow question 的答案更深入地了解了 Tuple 类和 ValueTuple 结构之间的区别以及何时使用什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2013-03-29
      • 1970-01-01
      相关资源
      最近更新 更多