Lazyを追加するという代物で、それだけだとヘーそーなんだー、としか思えないと思われます。ValueTaskを使っていくと、めっちゃくちゃ欲しくなる機能になってます。いうわけで、なんでこれが必要なのか、っていうところから説明します。5.0にasync/awaitが導入された当初はTaskしか存在しませんでした。標準APIのあらゆるメソッドにasyncメソッドを生やすなど、Microsoftの多大な努力により、C#はいち早く非同期時代を迎え、async/awaitは多用(濫用とも言う)されるようになりました。7.0から登場したのがValueTaskです。いう、もし中身が同期の場合はTを、非同期の場合はTaskをラップしたものとして存在しました。TaskとValueTaskの使い分けは、中身が非同期の場合が確定している場合はラップが不要で、かつ(当時)スタンダードな定義に沿うTaskを基本に考えていくのが良いでしょう。実際にアプリケーションを作っていくと、都度使い分けなんて考えられるものじゃないし、ValueTaskのオーバーヘッドといってもstructでラップするだけの話でそこまで大きいわけじゃない(同期のものをTaskで定義したほうがよほど大きい)ので、普通にアプリケーションで定義する場合のルールは全部ValueTaskでいーんじゃね?と思っていたりは、私の個人的な見解どまりでありました。いうものが導入されました。どれかの状態を持つという共用体となり、個別に実装されたシナリオでは中身がTask[T]の場合よりもIValueTaskSourceの場合のほうがパフォーマンスが高いということで、名実ともにValueTaskの天下の時代が始まりました。3以降だと思われますが、今でも問題なく使える状態&KestrelやSystem.IO.PipelinesにはValueTaskによるAPIが既に露出しています。MagicOnionのフィルターもValueTaskだったりしたりしましたり。別にTaskなんていらなかったんや......。ValueTaskの欠点そんなValueTask最大の欠点は、ユーティリティの欠如。WhenAllやWhenAnyができない。それらが必要な際はAsTaskでTaskに変換する必要がありました。Taskに変換する時点でオーバーヘッドじゃーん。あるなら、IValueTaskSourceを使ってネイティブなValueTask用のWhenAllやWhenAnyを作ればハイパフォーマンスじゃん!というわけで、それらを提供するのがValueTaskSupplementです。....)が便利ですよ!まとめ時代はValueTask。Taskのことは忘れて全部ValueTaskで良いのですー、良いのですー。ValueTaskで統一したら、すぐに標準のまんまじゃしんどいのですー、ってことに気づくでしょふ。そこでValueTaskSupplementですよ、っという流れです。いうわけで諦めて(?)使いましょう。Blogに寄稿しているのですが、なんとなくの私の中の使い分けは、Unityに関する成分が含まれる(新規)ライブラリはCygamesのブログのほうに、そうじゃないものはここに、みたいな気持ちではいます。どっちも見ていただければればですです。