我有一项任务是清理编译器警告的项目。目前我正在研究用于ASP.NET和Xamarin解决方案的cs文件。我有一个方法:
public override async SomeReturnTypeItem LoginAsync()
{
#if __MOBILE__
throw new NotSupportedException("Windows authentication is not supported in mobile version");
#endif
//some code
}
在Xamarin解决方案中,我发出警告,#endif
下的代码无法访问。如果我将#endif
替换为#else
并将#endif
放到方法的末尾,我会收到一条警告:该方法缺少await
运算符并将同步运行。如何使这种方法免于警告?
答案 0 :(得分:2)
最简单的解决方法是
public override async SomeReturnTypeItem LoginAsync()
{
#if __MOBILE__
throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
//some code using await
#endif
}
但这可能不是您想要的行为,因为如果定义__MOBILE__
,该方法将返回故障Task
而不是立即投掷。差异有时可能非常大,主要是如果您存储Task
以供以后使用而不是立即等待它(例如,如果您想要启动多个任务并让它们同时运行)。
要解决此问题,您应该将异常抛出代码放在方法中,将异步实现放在另一个方法中:
public override SomeReturnTypeItem LoginAsync()
{
#if __MOBILE__
throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
return LoginAsyncImpl();
#endif
}
private async SomeReturnTypeItem LoginAsync()
{
//some code using await
}
当然,如果您根本没有使用await
,那么您不应该首先将方法标记为async
!
public override omeReturnTypeItem LoginAsync()
{
#if __MOBILE__
throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
//some code not using await
#endif
}
请注意,非异步代码仍然可以返回Task
。这很有用,例如,如果你实现一个接口或基类,使某些方法返回任务,以便实现可能是异步的,但你的具体实现恰好是同步的。
public override Task SomeMethodAsync()
{
// do some synchronous stuff
return Task.FromResutl(true);
}
答案 1 :(得分:0)
这有点难看,但你可以这样做:
public override
#if !__MOBILE__
async
#endif
SomeReturnTypeItem LoginAsync() {
#if __MOBILE__
throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
//some code
#endif
}
这假设您在“某些代码”中实际上有await
关键字。如果没有,那么您应该删除async
。
或者,您只需使用#pragma
指令来禁止警告:
#pragma warning
答案 2 :(得分:0)
我使用的解决方案是欺骗编译器。
public override async SomeReturnTypeItem LoginAsync()
{
#if __MOBILE__
bool isMobile = true;
if (isMobile)
{
throw new NotSupportedException("Windows authentication is not supported in mobile version");
}
#endif
//some async code
}
Visual Stuidio说异步代码是启发式无法访问的,但编译器很满意。当然它有点难看,但它确实有效。但是,谢谢你们试图提供帮助)