async/await/Taskの罠

awaitする関数の戻り値はTaskを使う、戻り値側はTをそのまま書けばよい、という話だったと思うんですが。コンパイルが通らず。

using System.Threading.Tasks;
namespace study
{
    class Program
    {
        static void Main(string[] args)
        {
            MainThread();
        }

        static async void MainThread()
        {
            var ret =await IsValid();
        }

        static Task<bool> IsValid()
        {
            return true;
        }
    }
}

IsValidの戻り値のところでboolをTaskに暗黙に変換することができません、と。
結論から言うとstatic async Task IsValid()にすれば通ります。warning出るけど。からTaskへの変換はあくまでシンタックスシュガーで、asyncで修飾されていない場合は(ある意味当たり前ですが)そんな読み替えをしない、と。


行く先々で罠に引っかかっております。