重写异步方法时的错误代码.这种行为可以被关闭吗?
本文关键字:异步方法 错误代码 重写 | 更新日期: 2023-09-27 18:02:29
让我们考虑这个类:
public class A
{
public virtual async Task FooAsync()
{
await Task.Delay(3000);
}
}
如果你想通过输入"override"+从列表中选择FooAsync
来覆盖FooAsync
, VS 2013代码编辑器将生成以下代码:
public override async Task FooAsync()
{
return base.FooAsync();
}
,显然,它不会编译,直到您将return
更改为await
。
我知道,async
是一个实现细节,它可以在派生类型中更改,但这不是生成代码的原因,它最初不会编译。
这个行为可以被关闭(例如,使用一些VS设置)吗?
我不相信有办法改变这种行为。要添加的代码来自c:'Program Files (x86)'Microsoft Visual Studio 12.0'vc#'Snippets'1033'Refactoring'MethodOverrideStub.snippet
下的代码片段(在我的机器上)。代码片段是:
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Method Override Stub</Title>
<Description>Snippet for overriding a method</Description>
<Author>Microsoft Corporation</Author>
<SnippetTypes>
<SnippetType>Refactoring</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal Editable="true">
<ID>signature</ID>
<Default>signature</Default>
</Literal>
<Literal>
<ID>CallBase</ID>
<Function>CallBase(method)</Function>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[$signature$
{
$end$ $CallBase$
}]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
不幸的是,正如您希望看到的那样,决定方法签名和调用基类方法的实际"有趣"位不是代码段的一部分——而是由代码计算的。
Visual Studio 2015(查看RC/14.0.22823.1 D14REL)似乎解决了这个问题,但与您的要求相反-它避免将async
复制到签名中,这是更正确的,因为async
真的不应该被认为是方法签名的一部分,因为我认为你自己在你的问题中暗示;这是一个实现细节,改变方法的实现方式不应该影响签名。