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

6

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

    public static (string Name, int Age) GetFoo()
    {
        return ("Bar", 99);
    }

使用 .Net 4.6.2,这是否可能?一个 NuGet(DLL)如何改变我的可用语言功能?这里有关于此的任何文档可用吗?我找不到任何资料。


3
它不会改变你的语言特性。你正在使用的编译器版本已经支持元组,但它知道在某些框架版本中可能缺少System.ValueTuple,因此当它检测到缺少该结构体的框架版本时,它会提示你引用该包。 - Sean
我刚刚发现这个问题已经被关闭了。 真的吗?看看已经接受的答案,它恰好描述了正在发生的事情。 如果可能有一个精确的答案,那么这个问题怎么可能是太宽泛了呢? - Sven Bardos
1个回答

6
编译器只需要存在某些功能,才能将其绑定到代码中。对于`(string Name, int Age)`,编译器正在寻找`System.ValueTuple`,只要找到它,就可以愉快地工作了。通常这并不重要,只要能从当前运行时系统库或NuGet包中找到都可以!
这种方法已经被广泛应用于许多方面:
- "LINQ" - 只需正确的方法来解析,无论是通过扩展方法还是其他方式(这使得“LinqBridge”可以将LINQ添加到旧的运行时)。 - async/await - 只需存在 `GetAwaiter()` 等方法,无论是通过扩展方法还是其他方式。 - 异步迭代块和异步 foreach - 只需要存在`IAsyncEnumerable`等API(以及异步迭代器的正确构建器API)即可。 - 异步释放 - 只需要`IAsyncDisposable`接口存在即可。 - 等等。
因此,.NET和C#一直允许NuGet包(或其他库更新)"点亮"为"当前"框架设计的C#功能。
如果没有这些方法/类型/等可用,编译器仍然知道该功能,但除非它知道如何附加,否则无法使用。如果类型/方法解析成功,则代码可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接