我试图让我了解NETStandard类库,以获取我正在研究的潜在NuGet程序包。但是,这是我第一次使用NuGet和NETStandard软件包,因此我在某些方面有些迷失,其中之一是引用系统库。
dynamic类型是System.Runtime.CompilerServices.DynamicAttribute的一部分,但是,不存在对所述DLL的引用。虽然我只是继续进行添加,但似乎无法这样做。我想这不像框架类库那样工作吗?

如果我在解决方案资源管理器中右键单击Dependencies文件夹,然后单击Add Reference...,则似乎找不到可以使用的任何依赖项。不在Assemblies选项卡下,在Assemblies-> FrameworkExtensions下没有任何内容。

我只是试图了解它实际上是如何工作的,为什么我找不到任何依赖关系?

最佳答案

右键单击项目的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/

10-13 00:52