为何使用Func<T>时加()触发NullReferenceException,不加则无异常?
委托调用与直接赋值的差异解析
首先明确:Func<string>是一个委托类型,未初始化的委托变量默认值为null(因为委托属于引用类型)。
情况1:var func = GetFunc();
这里的()是执行委托指向的方法的操作。此时GetFunc是null,相当于你试图调用一个根本不存在的方法——委托实例本身都没指向任何有效方法,自然会触发NullReferenceException。就像拿一个空遥控器按按钮,根本没有设备能响应这个操作。
情况2:var func = GetFunc;
这里只是把委托变量本身的值拷贝给另一个变量,本质是传递引用。GetFunc的值是null,那func也会被赋值为null,这个过程只是变量间的赋值操作,没有尝试执行任何方法,所以不会抛出异常。就像把空遥控器递给别人,只是传递了这个空物件,没有按按钮的动作,自然不会有错误。
内容的提问来源于stack exchange,提问作者Manikanda Akash M
相关产品推荐
相关产品推荐

