C# c语言中的上、下转换#

C# c语言中的上、下转换#,c#,casting,C#,Casting,我有这样的设置: public class PseudoContext : DbContext { public DbSet<Account> Accounts {get; set;} public PseudoContext() { Accounts = new PseudoDbSet<Account>(); } } public class PseudoDbSet<T> : DbSet<T>

我有这样的设置:

public class PseudoContext : DbContext
{
    public DbSet<Account> Accounts {get; set;}

    public PseudoContext()
    {
        Accounts = new PseudoDbSet<Account>();
    }
}

public class PseudoDbSet<T> : DbSet<T> {}
公共类伪上下文:DbContext
{
公共数据库集帐户{get;set;}
公共伪上下文()
{
Accounts=新的伪数据库集();
}
}
公共类伪DbSet:DbSet{}
所以在运行时,
帐户
应该是
伪数据库集
类型

当我试图通过
DbSet accountsSet=context.Accounts访问
账户时,我无法通过
var tempSet=(PseudoDbSet)accountsSet将其向下转换为,我得到以下运行时异常:

测试方法RoleManager Test.PseudoContextTest.Add_ValidAccount_AccountAdded引发异常:System.InvalidCastException:无法将类型为“System.Data.Entity.DbSet 1[RoleManager.Models.Account]”的对象强制转换为类型为“RoleManager.Models.PseudoDbSet 1[RoleManager.Models.Account]

为什么呢


编辑以包含更多信息。

查看以下示例代码:

using System;

namespace Demo
{

    public class DbSet<T> { }

    public class Account { }

    public class PseudoContext
    {
        public DbSet<Account> Accounts {get; set;}

        public PseudoContext()
        {
            Accounts = new PseudoDbSet<Account>();
        }
    }

    public class PseudoDbSet<T> : DbSet<T> {}

    class Program
    {

        static void Main(string[] args)
        {

            PseudoContext ct = new PseudoContext();
            PseudoDbSet<Account> db = (PseudoDbSet<Account>)ct.Accounts;

            Console.WriteLine(typeof(PseudoDbSet<Account>).FullName);
            Console.WriteLine(ct.Accounts.GetType().FullName);

            Console.ReadLine();

        }
    }
}
使用系统;
名称空间演示
{
公共类DbSet{}
公共类帐户{}
公共类伪上下文
{
公共数据库集帐户{get;set;}
公共伪上下文()
{
Accounts=新的伪数据库集();
}
}
公共类伪DbSet:DbSet{}
班级计划
{
静态void Main(字符串[]参数)
{
伪上下文ct=新的伪上下文();
PseudoDbSet db=(PseudoDbSet)ct.Accounts;
Console.WriteLine(typeof(PseudoDbSet.FullName);
Console.WriteLine(ct.Accounts.GetType().FullName);
Console.ReadLine();
}
}
}
它工作正常,因为所有类都被正确继承


在代码中,
PseudoDbSet
继承的
DbSet
类有问题。尝试从这两种类型中拉出
FullName
,并在向下播放失败的位置将它们与
DbSet
类型的全名进行比较。在我的示例中,这两种类型是相同的,一切正常。

InvalidCastException“不是编译器错误,也没有发生任何强制转换。。请包括实际的错误消息和/或故障指示器。这里是:
测试方法RoleManager.PseudoContextTest.Add_ValidAccount_AccountAdded抛出异常:System.InvalidCastException:无法将类型为“System.Data.Entity.DbSet 1[RoleManager.Models.Account]”的对象强制转换为类型为“RoleManager.Models.PseudoDbSet 1”[RoleManager.Models.Account]。
在尝试
var tempSet=(PseudoDbSet)时进行强制转换accountsSet
。听起来更像是反向的,您试图将一些未知的数据库集转换为伪数据库集,这可能会失败。请记住,在编译时这些都是未知的。@Andreas Müller感谢您的提示,我更新了问题。@AndreasMüller不,更改确实在问题中:)我发现了问题。实际上,我使用了
DbSet accountSet=context.Set();
不重写伪上下文中的
Set()
。谢谢!