does not contain a definition for 'GetAwaiter'

本文关键字:GetAwaiter for definition not contain does | 更新日期: 2023-09-27 17:58:35

我用下面的一组代码得到了下面的错误,它在"allancelookup"行出错,我不确定我做错了什么,但我自己什么都看不到。我对crest的质疑似乎很好,但我的问题似乎是Awaiter,我想知道是否有办法解决这个问题?

DynamicCrest crest = new DynamicCrest();
var root = await crest.GetAsync(crest.Host);
var alliancelookup = await (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());
allianceid = alliancelookup.id;

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:"System.Dynamic.ExpandoObject"不包含"GetAwaiter"的定义在CallSite.Target(闭包、CallSite、Object)位于System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite站点,T0 arg0)位于***程序。<>c.<b_2_10>d.C:''Users----''Documents''Visual Studio 2015''Projects----''Program.cs:line 95 中的MoveNext()

does not contain a definition for 'GetAwaiter'

如果没有一个最小的、完整的、可验证的例子,就不可能确切地知道出了什么问题,但它看起来确实像是await在做一些不应该是await的事情。

拆分alliancelookup线路:

// Asynchronously retrieve the alliances.
var alliances = await root.GetAsync(r => r.alliances);
// Synchronously get the first matching one.
var allianceLookup = alliances.First(i => i.shortName == e.GetArg("allianceticker").ToUpper());

可能有更好的方法,将过滤器移动到异步代码中,但这取决于DynamicCrest

您还有一个等待时间。您只需要等待异步方法,但您也在等待结果,该结果显然声明的类型是dynamic。这就是为什么您没有得到编译时错误。

使用dynamic,它将尝试绑定运行时所需的方法。当使用async时,该方法是.GetAwaiter(),因此RuntimeBinderException"不包含'GetAwaiter'的定义"

也就是说,第三行应该是:

var alliancelookup = (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());

尽管按照斯蒂芬·克利里的建议分手是一种更好的做法。

您正在等待一个asyn调用,因此您必须将async Task放在调用此代码的方法的开头

public async Task<returntyp> Name()
{
  DynamicCrest crest = new DynamicCrest();
  var root = await crest.GetAsync(crest.Host);
  var alliancelookup = await (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());
  allianceid = alliancelookup.id;