今天調試程序總是報一個異常:
值不能為 null。
參數名: source
異常詳細信息: System.ArgumentNullException: 值不能為 null。
參數名: source
通過斷點發現是這段代碼錯誤,發生這個異常通常是方法中某個參數為空了,而我的方法中沒有一個名為source的參數啊,后來發現是 processors 為 NULL ,調用 Select 方法當然會出錯。
processors = taskWfService.IdentifyNextWorkflowProcessors(CurrentUserId, currentTaskWorkflow.ReportTaskId); var taskProcessorList = processors.Select(item => new TaskWorkflowProcessor { Processor = item }).ToList();
但是根據我們平時的經驗,一個為NULL的對象,調用它的方法時,應該拋出 NullReferenceException 未將對象設置到對象的實例 異常啊?比如我們調用 ToString() 方法
var theType = processors.ToString(); //Thrown a NullReferenceException
其實問題那就出在 Select() 方法,在 Select 上按 F12 查看定義
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
這是 System.Linq 下的擴展方法(.net 3.5之前是沒有的),除了 Select 還有很多平時常見的,比如 Where, Any, OrderBy, SelectMany, Take 等
這個方法內部判斷傳入的參數 source 為 NULL,就拋出一個 ArgumentNullException。
我覺得如果擴展方法中的 this 參數為 NULL,是否拋出一個 NullReferenceException 更為合適呢?至少排除錯誤時更容易,拙見