【发布时间】:2017-11-21 18:50:29
【问题描述】:
我面临一个非常奇怪的问题,不确定问题出在哪里。当我浏览代码并分析所有场景时,我没有 看到无论如何它都可以通过 ArgumentNullException。
但不知何故,在生产服务器中,它会抛出以下异常:
异常详细信息:System.ArgumentNullException:值不能为空。 参数名称:source
在 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 源)
在 GetDistinctValues(IList`1 textNames)
我在一个示例控制台应用程序中提取了代码。谁能告诉我当 GetDistinctValues 方法抛出这个 ArgumentNullException 时可能出现的情况?
示例代码sn-p:
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";
}
【问题讨论】:
-
if (!names.Any()) { return null; }inGetTextValues看起来像候选人 -
是的,我也认为
!names.Any()可能是罪魁祸首,因为如果names为空,那将失败 -
异常显示 - System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)。能不能返回trimmedValues.Distinct(StringComparer.InvariantCultureIgnoreCase).ToList();,我这里转成ToList()也能产生这个异常?
-
也许是这样:来自:var names = (List
)textNames; To : var names = textNames.Select(x => (string)x).ToList(); -
在该行引发异常的事实并不一定 - 特别是在使用延迟设计的 Linq 时 - 意味着该行也会导致错误。 ToList 只是强制现在调用以前的方法,其中一个会引发异常。