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将是一个动态变量”的结论的。