今天遇到一个我个人觉得很奇怪的问题,不是很能理解。public static IContext PlatContext { get; set; } 这个接口没有new出对应实现类。然后直接点出扩展方法不报错是为什么呢?我个人写出的都是执行到的时候提示没有实例化?求解
它可能是别的地方装配的,肯定接口会传入一个实现的类,你可以用 this.PlatContext.GetType() 输出实现类的类型看看
编译期和运行期
你能点出来,那是编译器,IDE的功能。因为编译器只需要知道“对象元数据”就可以提示,他并不需要知道对象实例
运行期报错那是因为运行期就必须得有对象实例了。
这个就像你上个帖子我回复的,最后那个ofType去过滤,在oftype和前面查找过滤type的时候,我们都只是查询对象元数据。所以他不会触发构造。
在你提供的代码中,Common 类有一个公共的静态属性 PlatContext,其类型为 IContext 接口,并且还有一个泛型静态方法 Resolve,用于解析某个类型 T 的实例。
在这种情况下,调用 Common.PlatContext 并在其上调用 Resolve 方法,即使 PlatContext 没有实例化(默认为 null),也不会导致空引用异常。这是因为 C# 中的扩展方法有一些特殊的行为。
你提供的代码片段中,虽然 Resolve 看起来是一个静态方法,但实际上它是一个扩展方法。这是因为方法的第一个参数被标记为 this,并且它扩展了 IContext 接口。因此,当你调用 PlatContext.Resolve(key) 时,编译器将自动将其转换为扩展方法调用。
IContextExtensions 是一个静态类,它包含了 Resolve 扩展方法的定义。这就是为什么你可以直接在 PlatContext 上调用 Resolve 方法而不会报空引用异常的原因。