小编Zby*_*ekZ的帖子

GetTypeInfo可以返回null吗?

我正在重写一些代码(目前针对.NET 4.5.2.),它使用反射来编译.NET Standard 1.4.因此,我需要在许多地方对Type使用GetTypeInfo().

为了正确处理边缘情况,我的问题是,GetTypeInfo()是否可以返回null?文档(https://msdn.microsoft.com/en-us/library/system.reflection.introspectionextensions.gettypeinfo(v=vs.110).aspx)对此保持沉默.

当我从标准的.NET 4.5.2项目中打开GetTypeInfo()源时,我得到:

public static class IntrospectionExtensions
{
    public static TypeInfo GetTypeInfo(this Type type){
        if(type == null){
            throw new ArgumentNullException("type");
        }
        var rcType=(IReflectableType)type;
        if(rcType==null){
            return null;
        }else{
            return rcType.GetTypeInfo();
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

这仍然令人困惑.当'(IReflectableType)类型为null时,有一个代码分支返回null,但为什么呢? - 之前检查'type'本身是否为null,并且当它为null时抛出异常,因此我无法看到'rcType'如何为null(请注意,这不是'as'运算符,它是一个直的类型).

在一个很好的传统中,IReflectableType.GetTypeInfo(,https: //msdn.microsoft.com/en-us/library/system.reflection.ireflectabletype.gettypeinfo( v= vs.110 ) .aspx )上的文档也没有提及结果为空的可能性.

使用反射的代码需要在许多地方使用GetTypeInfo,如果允许null结果,则需要在每个这样的地方进行空检查和相应的操作.我检查了其他人的代码(包括微软自己的例子,地址是https://msdn.microsoft.com/en-us/library/system.reflection.typeinfo%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396并且开发人员似乎将其视为无效结果.那是对的吗?

.net c# .net-standard

6
推荐指数
1
解决办法
302
查看次数

在ISO Prolog中没有捕获

我正在努力克服throw/1的精确语义,而没有ISO Prolog中合适的catch/3.我正在阅读ISO Prolog规范,在我看来,执行将以无限递归结束.

(请注意,您必须能够访问ISO Prolog标准才能解释此问题).

步骤1.假设我们调用throw(未知),并且堆栈上没有catch/3.

步骤2.它将在7.8.10.1 c)结束,说它将是一个系统错误(7.12.2 j).

第3步.这是在其他地方用于其他地方的同一种配方,所以我认为它应该以相同的方式解释.因此7.12.1适用,并且当前目标(throw/1)将被throw替换(error(system_error,Imp_def)).

步骤4.执行此目标将在堆栈上找不到活动的"catch".因此,它应该尝试相同的步骤,继续步骤2,依此类推=>无限递归.

你可能会说未被捕获的"throw"转换为system_error是"最终的"并且不会像其他错误一样进一步处理,并且它可能必须如此,以避免我描述的问题,但我的问题是,标准在哪里涵盖

其他一些注释,为了完整性:

  1. 7.12.2中的注4也提到了在这种情况下出现系统错误的可能性.我认为那里使用的公式("......没有活跃的目标捕获/ 3")在另一个方面引入了一些混淆,因为它应该符合条件,即捕手必须与错误术语统一(B ).

  2. 将未捕获的throw-s转换为系统错误背后的想法是什么?它看起来可能存在,使Prolog处理器的顶级生活"更容易",因此它只能收到一个可预测的错误?对我而言,这带来的问题多于好处 - 错误的真正原因因此消失 - 任何意见或评论?

  3. 形式语义(附件A)似乎也以某种方式与此斗争,尽管我没有详细研究它.在A.2.5,它提到,"...然而,在正式规范有在根捕手...",并且涉及它,例如,向的findall/3的执行.那么正式的规范与正文有何不同?

iso-prolog

3
推荐指数
1
解决办法
197
查看次数

标签 统计

.net ×1

.net-standard ×1

c# ×1

iso-prolog ×1