C# 联合合同:虚假警告“;可能取消绑定空引用“;

C# 联合合同:虚假警告“;可能取消绑定空引用“;,c#,.net,code-contracts,C#,.net,Code Contracts,在上图中,您可以看到来自代码契约的警告。我认为这是不合法的,因为这个永远不可能是空的 这是一个错误还是我遗漏了什么 此属性是以下类的成员: public class NHibernateIQueryableQueryBase<TEntity, TQuery, TQueryInterface> : IQuery<TEntity>, IFluentQueryInterface<TEntity, TQueryInterface> where TQu

在上图中,您可以看到来自代码契约的警告。我认为这是不合法的,因为
这个
永远不可能是
空的

这是一个错误还是我遗漏了什么


此属性是以下类的成员:

public class NHibernateIQueryableQueryBase<TEntity, TQuery, TQueryInterface>
    : IQuery<TEntity>, IFluentQueryInterface<TEntity, TQueryInterface>
    where TQuery : NHibernateIQueryableQueryBase<TEntity, TQuery,
                                                 TQueryInterface>,
                   TQueryInterface
    where TQueryInterface : IQuery<TEntity>
基于,我想说您需要指定如果强制转换失败会发生什么


尝试
将其作为TQuery返回
,因为如果强制转换失败,
as
操作符将返回null,而显式强制转换将抛出错误。

分析不理解
保证实现
TQuery

因此,它警告您,您最终可能会获取接口类型的
null
引用,并将其作为实现该接口的
struct
返回:


您需要将
:class
添加到
TQueryInterface
参数的约束中。

在黑暗中完成拍摄,因为我是一个noob,我相信您已经想到了这一点,但是TQuery的强制转换(this)不能返回null吗?请向我们展示您的类型声明。您对这些通用参数有什么限制?@JesseCarter:没有。它可能会导致InvalidCastException,所以我认为这不是警告的原因。@SLaks:更新了问题。我担心这相当复杂,但基本上可以保证强制转换将始终成功。我怀疑向约束添加
:class
将抑制警告。
public TQueryInterface And
{
    get
    {
        var result = this as TQuery;
        return result;
    }
}