System.ValueTuple NuGet 如何扩展我的语言功能?

Sve*_*dos 6 c# roslyn valuetuple

如果使用 .Net < 4.7 元组不受支持。如果我安装了 NuGet“System.ValueTuple”,我就可以编写如下代码

    public static (string Name, int Age) GetFoo()
    {
        return ("Bar", 99);
    }
Run Code Online (Sandbox Code Playgroud)

使用 .Net 4.6.2。这怎么可能?NuGet (DLL) 如何更改我的可用语言功能?有没有关于这里发生的事情的可用文件?我找不到任何。

Mar*_*ell 6

编译器只需要存在某些功能即可绑定到它们。在(string Name, int Age)它正在寻找的情况下System.ValueTuple<T1,T2>——只要它找到了,它就是快乐的。它通常来自哪里并不重要- 如果它来自当前的运行时系统库:很好;如果它来自 nuget 包:也可以!

这有很多渊源;同样的方法适用于很多事情:

  • “LINQ” - 只需要正确的方法来解决,无论是否通过扩展方法(例如,这允许“LinqBridge”将 LINQ 改装到旧的运行时)
  • async/await - 只需要GetAwaiter()存在 etc 方法,无论是否通过扩展方法
  • 异步迭代器块和异步 foreach - 只需要IAsyncEnumerable<T>存在 etc API(以及异步迭代器的正确构建器 API)
  • async dispose - 只需要IAsyncDisposable接口存在
  • 等等

因此,.NET 和 C# 长期以来一直允许 nuget 包(或其他库更新)“点亮”专为“当前”框架设计的 C# 功能。

如果没有这些方法/类型/等可用,编译器仍然知道该功能- 除非它知道如何附加,否则它无法使用它。如果类型/方法解决:你是金。