如果使用 .Net < 4.7 元组则不受支持。如果我安装 NuGet“System.ValueTuple”,我可以编写如下代码
public static (string Name, int Age) GetFoo()
{
return ("Bar", 99);
}
使用 .Net 4.6.2。这怎么可能?NuGet (DLL) 如何更改我的可用语言功能?是否有任何关于这里发生的事情的文档?我找不到任何东西。
如果使用 .Net < 4.7 元组则不受支持。如果我安装 NuGet“System.ValueTuple”,我可以编写如下代码
public static (string Name, int Age) GetFoo()
{
return ("Bar", 99);
}
使用 .Net 4.6.2。这怎么可能?NuGet (DLL) 如何更改我的可用语言功能?是否有任何关于这里发生的事情的文档?我找不到任何东西。
编译器只需要存在某些功能即可绑定到它们。在(string Name, int Age)
它正在寻找的情况下System.ValueTuple<T1,T2>
——只要它找到了,它就很高兴。通常从哪里来并不重要——如果它来自当前的运行时系统库:很好;如果它来自 nuget 包:也很好!
这有很多血统书;同样的方法适用于很多事情:
GetAwaiter()
存在 etc 方法,无论是否通过扩展方法IAsyncEnumerable<T>
存在 etc API(以及异步迭代器的正确构建器 API)IAsyncDisposable
接口存在因此,.NET 和 C# 在允许 nuget 包(或其他库更新)“点亮”为“当前”框架设计的 C# 功能方面享有悠久的历史。
如果没有这些方法/类型/等可用,编译器仍然知道该功能- 除非它知道如何附加,否则它无法使用它。如果类型/方法解析:你是金子。