System.ValueTuple NuGet 如何扩展我的语言功能?
How does the System.ValueTuple NuGet expand my language features?
如果使用 .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 包:也很好!
这有很多血统;同样的方法适用于很多事情:
- "LINQ" - 只需要正确的方法来解决,无论是否通过扩展方法(这允许 "LinqBridge",例如,将 LINQ 改造到旧的运行时)
- async/await - 只需要
GetAwaiter()
等方法存在,无论是否通过扩展方法
- 异步迭代器块和异步 foreach - 只需要存在
IAsyncEnumerable<T>
等 API(以及异步迭代器的正确构建器 API)
- async dispose - 只需要
IAsyncDisposable
接口存在
- 等等
所以 .NET 和 C# 长期以来一直允许 nuget 包(或其他库更新)到 "light up" 为 "current" 框架设计的 C# 功能。
如果这些方法/类型/等不可用,编译器仍然知道该功能 - 除非它知道如何附加,否则无法使用它。如果类型/方法解析:你是金色的。
如果使用 .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 包:也很好!
这有很多血统;同样的方法适用于很多事情:
- "LINQ" - 只需要正确的方法来解决,无论是否通过扩展方法(这允许 "LinqBridge",例如,将 LINQ 改造到旧的运行时)
- async/await - 只需要
GetAwaiter()
等方法存在,无论是否通过扩展方法 - 异步迭代器块和异步 foreach - 只需要存在
IAsyncEnumerable<T>
等 API(以及异步迭代器的正确构建器 API) - async dispose - 只需要
IAsyncDisposable
接口存在 - 等等
所以 .NET 和 C# 长期以来一直允许 nuget 包(或其他库更新)到 "light up" 为 "current" 框架设计的 C# 功能。
如果这些方法/类型/等不可用,编译器仍然知道该功能 - 除非它知道如何附加,否则无法使用它。如果类型/方法解析:你是金色的。