c# - 为什么我们不能在 C# 中使用 Iterator StateMachine Attribute?

标签 c# iterator state-machine compiler-services

我对我试图派生的类执行了转到定义 (F12),我注意到其中一个方法标有 AsyncStateMachineAttribute。这又继承了 StateMachineAttribute。我很好奇并决定在 MSDN 上阅读此属性及其所有派生词。这让我找到了 this我遇到了这个声明:

You can't use IteratorStateMachineAttribute to test whether a method is an iterator method in C#.

因为该声明是为了脱颖而出,所以它一定有严重的影响,但没有进一步解释为什么会这样。有没有人有这方面的见解?

最佳答案

我 99% 确定它是历史性的。基本上,C# 在 C# 2 中引入了迭代器 block - 很长时间才引入此属性。

等效的异步属性与 C# 中的异步方法同时引入,所以这很好......但即使 C# 编译器现在应用 IteratorStateMachineAttribute 到迭代器 block :

  • 它不适用于使用旧版本编译器创建的库,因此您不能在那里依赖它。
  • 它不适用于以 4.5 之前的 .NET 版本为目标的库。 (老实说,我不确定 VB 编译器在这里做了什么。它可能会省略该属性,或者可能需要您以最新版本的 .NET 为目标才能使用迭代器方法。)

我会说方法上存在 IteratorStateMachineAttribute 是一个很好的指标,表明它 是一个迭代器方法(尽管没有什么可以阻止恶作剧的开发人员应用它到其他方法),但由于 C# 编译器的旧版本,它不是一个充分的测试。

关于c# - 为什么我们不能在 C# 中使用 Iterator StateMachine Attribute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37387248/

相关文章:

python - 迭代 Torchtext.data.BucketIterator 对象抛出 AttributeError 'Field' 对象没有属性 'vocab'

parsing - 以功能纯方式生成不可变的具体语法树的适当数据结构或算法是什么?

c++ - 避免 while (!is_eof)

c# - 使用套接字通过代理将请求从客户端中继到服务器 C#

c# - 写出 zip 文件在 IE7 中不起作用

c# - EF Core 3.1 查询有时超快但有时很慢

ruby-on-rails - 在数据库中存储工作流(状态机)。最好的方法是什么?

c# - 评论内有错误..?

java - 为什么listiterator中的hasPrevious()和add()组合会进入无限循环,而hasNext()和add()则不会?

c++ - 如何检测类型是迭代器还是 const_iterator