我试图让我了解NETStandard类库,以获取我正在研究的潜在NuGet程序包。但是,这是我第一次使用NuGet和NETStandard软件包,因此我在某些方面有些迷失,其中之一是引用系统库。dynamic
类型是System.Runtime.CompilerServices.DynamicAttribute
的一部分,但是,不存在对所述DLL的引用。虽然我只是继续进行添加,但似乎无法这样做。我想这不像框架类库那样工作吗?
如果我在解决方案资源管理器中右键单击Dependencies
文件夹,然后单击Add Reference...
,则似乎找不到可以使用的任何依赖项。不在Assemblies
选项卡下,在Assemblies
-> Framework
或Extensions
下没有任何内容。
我只是试图了解它实际上是如何工作的,为什么我找不到任何依赖关系?
最佳答案
右键单击项目的Dependencies节点> Manage Nuget Packages> Browse,然后在搜索框中键入“dynamic”。从列表顶部选择 System.Dynamic.Runtime
,现在您可以在源代码中使用dynamic
了。
如果您像我一样对为什么可以使用dynamic
关键字而不在方法的代码中引用DLR库但在属性的声明中不能引用DLR库的原因感兴趣,请继续阅读。
看一下下面的C#代码行,这些行使用NETStandard.Library编译时没有问题,而没有引用System.Dynamic.Runtime
。下面的C#代码中的第1行和第3行之间的主要区别是关键字dynamic vs var的使用或动态类型与静态类型。
Line 1: dynamic a = new {a = 1, b = 2};
Line 2: a = new Class1();
Line 3: var b = new { a = 1, b = 2 };
这是相同三行的简化IL,以供您引用。
Line 1: newobj instance void class '<>f__AnonymousType0`2'<int32,int32>::.ctor(!0,!1)
Line 2: newobj instance void ClassLibrary2.Class1::.ctor()
Line 3: newobj instance void class '<>f__AnonymousType0`2'<int32,int32>::.ctor(!0,!1)
如果比较生成的IL代码的第1行和第3行,您将发现没有任何区别。编译器可以从初始化代码推断出type of the variable,还可以针对不同类型重新启用相同的变量。在这种情况下,无需依赖DLR。
另一方面,将类的auto属性声明为
dynamic
时,会发生完全不同的事情。public class Class1 { public dynamic Test { get; set; } }
自动属性的IL代码显示
dynamic
属性将转换为object
类型的私有(private)后备字段,以及初始化,getter和setter的代码,这些代码严重依赖于System.Runtime.CompilerServices.DynamicAttribute
中的 System.Dynamic.Runtime
并将依赖关系引入DLR在这种情况下。关于c# - 在NETStandard类库中添加引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43744768/