Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可空值元组问题_C#_Nullable_C# 7.0 - Fatal编程技术网

C# 可空值元组问题

C# 可空值元组问题,c#,nullable,c#-7.0,C#,Nullable,C# 7.0,我正在尝试更新我的代码以使用新的值元组,总的来说,它使代码更具可读性,所以我喜欢它 但是,我在使用可空值时遇到了问题。特别是,我有必须为null的集合项,或者在某些条件下返回null值的函数。例如: internal static TValue SafeTryGet<TKey, TValue>(this IDictionary<TKey, TValue> list, TKey key) => list.TryGetValue(key, out TVa

我正在尝试更新我的代码以使用新的值元组,总的来说,它使代码更具可读性,所以我喜欢它

但是,我在使用可空值时遇到了问题。特别是,我有必须为null的集合项,或者在某些条件下返回null值的函数。例如:

internal static TValue SafeTryGet<TKey, TValue>(this IDictionary<TKey, TValue> list, TKey key) =>
        list.TryGetValue(key, out TValue ret) ? ret : default(TValue);
除了提供一个新的方法来实现这一点之外,当TValue是一个结构时,是否有一种干净的编写方法来返回一个可为null的类型?我强调“干净”一词,因为我显然可以围绕它编写代码,但我希望这个问题有一个语义解决方案,而不是暴力手段

请记住,FirstOrDefault Linq方法也会出现同样的问题。它不会返回null,这使得它在这个上下文中非常无用。如果可能的话,我想要一个解决方案来解决这个问题


编辑:请记住Linq问题。这不是另一个员额的重复,因为他们的要求更加灵活。如果可能的话,我想让Linq正常使用值元组

至于链接问题,很容易解决:

IEnumerable<int> values = ...

int? fod = values.Select(i => (int?)i).FirstOrDefault();
请注意,这不仅适用于IEnumerable,也适用于IQueryable


至于更一般的问题,答案确实是

不清楚你的问题与你的例子有什么关系

您可以对任何类型值类型或引用类型元素的IEnumerable进行如下扩展:

public static bool TryGetFirst<T>(this IEnumerable<T> source, out T first)
{
  var oneOrEmpty = source.Take(1).ToList();
  if (oneOrEmpty.Count == 1)
  {
    first = oneOrEmpty[0];
    return true;
  }
  first = default(T);
  return false;
}

在本例中,返回值为null表示没有第一个元素。

@Servy,它不是重复的,这是Linq的一个真正问题。FirstOrDefault、SingleOrDefault等,它们都不能与新的值元组类型一起工作,除非我遗漏了一些明显的东西。您的代码根本没有使用LINQ。您提供了两种不起作用的方法;副本解释了它们不起作用的原因,并为解决问题提供了不同的解决方案。那些LINQ方法不能处理元组也是错误的。他们不会做你想让他们做的事;这是非常不同的,也与你问的问题无关。这不是无关的,这是有意使用相同的模式,我可能会补充。我使用的措辞非常清楚,同样的问题也发生在FirstOrDefault Linq方法上。它不会返回'null',这使得它在这个上下文中毫无用处。当然,它们是有效的,它们只是不返回任何有用的信息。我多次重读这个问题,并同意@Servy。你提到LINQ,元组,但不要在任何地方使用它们。我也不明白C7在这里是怎么联系的是的,你使用了C7的一个特性,但是没有它,它是一样的。如果你不同意这是重复的,也许你应该提供更多的细节。@Servy好的,我错了。我对这个问题的理解不同,但对答案的回答表明你的解释是正确的。“那么你就闭嘴了。”克里斯范德莫顿不,第一个是这样说的。这将只列举一次,而不会列举太多。这并不能解决问题所要解决的问题。OP不希望从序列中获取第一项。
public static bool TryGetFirst<T>(this IEnumerable<T> source, out T first)
{
  var oneOrEmpty = source.Take(1).ToList();
  if (oneOrEmpty.Count == 1)
  {
    first = oneOrEmpty[0];
    return true;
  }
  first = default(T);
  return false;
}
public static bool TryGetFirst<T>(this IEnumerable<T> source, out T first)
{
  using (var e = source.GetEnumerator())
  {
    if (e.MoveNext())
    {
      first = e.Current;
      return true;
    }
  }
  first = default(T);
  return false;
}
public static T? TryGetFirst<T>(this IEnumerable<T> source) where T : struct
{
  return source.Select(t => (T?)t).FirstOrDefault();
}