Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 某些情况下需要在泛型方法上显式转换为T_Generics_C# 4.0 - Fatal编程技术网

Generics 某些情况下需要在泛型方法上显式转换为T

Generics 某些情况下需要在泛型方法上显式转换为T,generics,c#-4.0,Generics,C# 4.0,我有一个让我困惑的情况,希望能得到一些帮助。在下面的代码中,FindById方法不必强制转换返回,但是updateAuditedEntity调用不需要。请注意: AuditedEntity源于实体 将auditedEntity强制转换为实体不起作用,仅强制转换为t起作用 如果您能了解我在这里遗漏的内容,我们将不胜感激。起初我认为这与变化有关,但正如我上面提到的,我试着降低了演员阵容,但没有成功 public class NHibernateRepository<T> : NH

我有一个让我困惑的情况,希望能得到一些帮助。在下面的代码中,FindById方法不必强制转换返回,但是updateAuditedEntity调用不需要。请注意:

  • AuditedEntity源于实体
  • 将auditedEntity强制转换为实体不起作用,仅强制转换为t起作用
  • 如果您能了解我在这里遗漏的内容,我们将不胜感激。起初我认为这与变化有关,但正如我上面提到的,我试着降低了演员阵容,但没有成功

        public class NHibernateRepository<T> : NHibernateBase,
        IRepository<T> where T : Entity
    {
    
        public IEnumerable<T> FindAll(Expression<Func<T, bool>> predicate)
        {
            var query = GetQuery(predicate);
            return Transact(() => query.ToList());
        }
    
        public T FindById(int id)
        {
            // TODO: Why does this work when below doesn't
            return FindAll(e => e.Id == id).FirstOrDefault();
        }
    
        private T UpdateAuditedEntity(T item)
        {
            var auditedEntity = item as AuditedEntity;
    
            if (auditedEntity == null) return item;
    
            auditedEntity.DateModified = DateTime.UtcNow;
    
            // TODO: figure out why this cast is necessary
            return auditedEntity as T;
        }
    
    公共类NHibernateRepository:NHibernateBase,
    i假设式,其中T:实体
    {
    公共IEnumerable FindAll(表达式谓词)
    {
    var query=GetQuery(谓词);
    返回Transact(()=>query.ToList());
    }
    公共T FindById(int id)
    {
    //TODO:为什么在下面不起作用的情况下,这个功能还能工作
    返回FindAll(e=>e.Id==Id).FirstOrDefault();
    }
    私有T UpdateAuditEntity(T项)
    {
    var auditedEntity=作为auditedEntity的项目;
    如果(auditedEntity==null)返回项;
    auditedEntity.DateModified=DateTime.UtcNow;
    //TODO:找出为什么这个演员阵容是必要的
    将被审核的数据返回为T;
    }
    
    这是必要的,因为尽管AuditedEntity和T都派生自实体,但AuditedEntity可能不会继承由T表示的任何类型


    例如,假设您创建了一个类型“OtherEntity”直接继承的实体。
    NHibernateRepository
    的实例将具有UpdateAddEntity返回AuditedEntity,该属性不继承其他实体-因此返回的类型将无效。

    这是必要的,因为尽管AuditedEntity和T都是从实体派生的,但AuditedEntity可能不会继承任何Type由T表示

    例如,假设您创建了一个直接继承实体的类型“OtherEntity”。
    NHibernateRepository
    的实例将具有UpdateAddItemEntity返回AuditedEntity,而AuditedEntity不继承OtherEntity,因此返回的类型将无效

    AuditedEntity源于实体

    好的,但是在这个泛型类中,
    T
    实体
    的任意派生。编译器不关心您的
    auditedEntity
    是通过强制转换
    创建的-实际上,这里可能有自定义转换在进行意外操作-因此不允许您返回变量从请求
    T
    的方法中键入为
    AuditedEntity

    在这个特定的方法中,由于
    审核属性
    同一个对象,因此您只需执行以下操作即可

    return item;
    
    作为
    updateAditeIdentity
    的最后一条语句,编译器会很高兴的

    AuditedEntity源于实体

    好的,但是在这个泛型类中,
    T
    实体
    的任意
    派生。编译器不关心您的
    auditedEntity
    是通过强制转换
    创建的-实际上,这里可能有自定义转换在进行意外操作-因此不允许您返回变量从请求
    T
    的方法中键入为
    AuditedEntity

    在这个特定的方法中,由于
    审核属性
    同一个对象,因此您只需执行以下操作即可

    return item;
    

    作为
    updateuditedentity
    的最后一条语句,编译器会很高兴的。

    一般来说这是正确的,但是看看
    updateuditedentity
    的主体-如果
    T
    不是(an)
    AuditedEntity
    ,它返回null。在问题行中,我们了解有关
    T
    的更多信息,但编译器没有t@AskashM:您的观点对于避免方法体中的转换是有效和实用的,但我将问题解释为为什么OP不能从方法返回AuditedEntity类型的实例。OP似乎是未执行的r错误理解从实体继承会使转换变得不必要。一般来说,这是正确的,但请查看
    UpdateAddIdentity
    -的主体,如果
    T
    不是(an)
    AuditedEntity
    ,它返回null。在问题行中,我们了解有关
    T
    的更多信息,但编译器没有t@AskashM:您的观点对于避免方法体中的转换是有效和实用的,但我将问题解释为为什么OP不能从方法返回AuditedEntity类型的实例。OP似乎是未执行的r错误理解从实体继承会使转换变得不必要。