2017-06-19 58 views
0

我面临一个非常奇怪的问题,并不确定问题出在哪里。当我遍历代码并分析所有场景时,我不会在 中看到,无论如何它都可以通过ArgumentNullException。如何在给定的场景中引发ArgumentNullException IList.Distinct方法

但不知何故,在生产服务器,它抛出以下异常:

异常详细信息:System.ArgumentNullException:值不能为空。 参数名称:源
在System.Linq.Enumerable.ToList [TSource](IEnumerable`1源)
在GetDistinctValues(IList`1 textNames)

我已提取在一个示例控制台应用程序的代码。任何人都可以告诉我什么时候GetDistinctValues方法可以抛出这个ArgumentNullException?

的示例代码段:

private IList<string> GetDistinctValues(IList<string> textNames) 
{ 
    var values = GetTextValues(textNames); 
    var trimmedValues = values.Select(value => value.Trim()); 
    return trimmedValues.Distinct(StringComparer.InvariantCultureIgnoreCase).ToList(); 
} 

public static IList<string> GetTextValues(IList<string> textNames) 
{ 
    var values = new List<string>(); 
    var names = (List<string>)textNames; 
    if (!names.Any()) 
    { 
     return null; 
    } 

    names.ForEach(x => values.Add(GetValue(x))); 

    return values; 
} 

private static string GetValue(string name) 
{ 
    // returns some value depending on name 

    return "someValue"; 
} 
+10

'if(!names.Any()) { return null;}'GetTextValues'''看起来像候选人 – stuartd

+1

是的,我也认为'!names.Any()'是可能的罪魁祸首,因为如果'names'为null将会失败 –

+0

异常显示 - System.Linq.Enumerable .ToList [TSource](IEnumerable'1 source)。可以返回trimmedValues.Distinct(StringComparer.InvariantCultureIgnoreCase).ToList();其中我将它转换为ToList()也可以生成此异常? – App

回答

0

ToList是一个扩展方法,可能有这样的签名:public static List<T> ToList<T>(this IEnumerable<T> source)。读取例外情况,source为空。 Ergo,GetTextValues返回null。当没有names时,它会执行哪个操作。

0

如果你想在LINQ中使用你的收藏,你应该 从来没有!永远!如果您没有任何回报,则返回null。相反,您应该返回Enumerable.Empty或空集合。如果你的函数决定它没有元素返回它应该返回一个枚举器,在这种情况下枚举器枚举没有元素。

考虑更改功能:

public static IEnumerable<string> GetTextValues(IEnumerable<string> textNames) 
{ 
    if (textNames == null) 
     return Enumerable.Empty<string>(); 
     // or consider: throw ArgumentNullException(nameof(textNames)); 
    return textNames.Select(textName => GetValue(textName)); 
} 

有关返回,而不是一个列表可枚举的好处是,如果你的函数的用户只需要您的列表的前几个元素,仅创建几个要素。

相关问题