C# var关键字可以将变量类型更改为动态?

C# var关键字可以将变量类型更改为动态?,c#,.net-core,C#,.net Core,我有一个名为Entity1Service的Entity1Service服务,它包含一个方法GetBySerial,该方法负责从数据库(我使用过)中获取适当的文档并返回: public class Entity1Service { private readonly LiteCollection<Entity1> _entity1Collection; private readonly LiteDatabase _db; public Entity1Servic

我有一个名为
Entity1Service
Entity1Service
服务,它包含一个方法
GetBySerial
,该方法负责从数据库(我使用过)中获取适当的文档并返回:

public class Entity1Service
{
    private readonly LiteCollection<Entity1> _entity1Collection;
    private readonly LiteDatabase _db;

    public Entity1Service()
    {
        _db = new LiteDatabase(Constants.DbFileName);
        _entity1Collection = _db.GetCollection<Entity1>(nameof(Entity1));
    }
    public Entity1 GetBySerial(string serial)
    {
        var q = Query.EQ(nameof(Entity1.Serial), serial);

        lock (Constants.DbLockObj)
        {
            return _entity1Collection.Find(q).SingleOrDefault();
        }
    }
}
e1
将是一个动态变量。但是,如果我这样使用它:

Entity1Service _entity1Service = new Entity1Service();
dynamic MyDynamic = new System.Dynamic.ExpandoObject();
MyDynamic.Serial = "serial";
var e1 = _entity1Service.GetBySerial(MyDynamic.Serial);
Entity1 e1 = _entity1Service.GetBySerial("serial");
其类型将如预期的那样为
Entity1
。我不明白为什么编译器会这样

我在控制台应用程序dotnetcorev中遇到了这种行为。2.1和C#v。7.3

更新:


多亏了乔恩·斯基特,我试图做出一个他在评论中提到的“最小可复制的例子”。因此,在这个过程中,我发现问题的发生是因为为了简单起见,我从代码中删除了一个代码。因此,当我将动态值作为参数传递给方法时,问题就发生了。所以我编辑了第一段代码

这并不是关于
var
。这只是显示了显式类型代码中已经发生的事情。这是关于动态类型是如何工作的。几乎任何涉及
动态
的表达式的结果都被视为
动态

所以在这段代码中:

Entity1Service\u Entity1Service=new Entity1Service();
dynamic MyDynamic=new System.dynamic.ExpandoObject();
MyDynamic.Serial=“Serial”;
var e1=_entity1Service.GetBySerial(MyDynamic.Serial);
。。。
MyDynamic.Serial
的编译时类型是
dynamic
,对
\u entity1Service.GetBySerial
的调用是动态绑定的,结果是
dynamic
。当您显式地将
e1
键入为
Entity1
时,实际上是在调用后添加了一个强制转换

如果您只是确保表达式中的所有内容都是静态类型的,那么结果将具有您期望的静态类型。例如,您可以强制转换参数:

Entity1Service\u Entity1Service=new Entity1Service();
dynamic MyDynamic=new System.dynamic.ExpandoObject();
MyDynamic.Serial=“Serial”;
var e1=_entity1Service.GetBySerial((字符串)MyDynamic.Serial);
或者可以使用单独的局部变量:

Entity1Service\u Entity1Service=new Entity1Service();
dynamic MyDynamic=new System.dynamic.ExpandoObject();
MyDynamic.Serial=“Serial”;
string serial=MyDynamic.serial;
var e1=_entity1Service.GetBySerial(串行);

无论哪种方式,
\u entity1Service.GetBySerial
调用现在是静态绑定的-这几乎是您想要的-并且
e1
的类型将是
Entity1

什么是
entity1Collection
的类型?以及
\u entity1Service
的类型是什么?如果这是
动态的
,这就解释了一切——但如果没有它,我肯定会认为
e1
的类型是
Entity1
。请提供一个示例来说明您正在观察的内容,否则很难帮助您。我已更新了我的问题并澄清了对象的类型。您尚未提供示例,因此我们仍然无法帮助您。我们甚至还不知道
\u entity1Service
的编译时类型,您也没有说您是如何得出“e1将是一个动态变量”的结论的。