C# 重写异步方法时出现错误代码。可以关闭此行为吗? 让我们来考虑一下这个类: public class A { public virtual async Task FooAsync() { await Task.Delay(3000); } }

C# 重写异步方法时出现错误代码。可以关闭此行为吗? 让我们来考虑一下这个类: public class A { public virtual async Task FooAsync() { await Task.Delay(3000); } },c#,visual-studio-2013,async-await,C#,Visual Studio 2013,Async Await,如果您试图通过键入override+从列表中选择FooAsync来覆盖FooAsync,VS 2013代码编辑器将生成以下代码: public override async Task FooAsync() { return base.FooAsync(); } 显然,在将return改为wait之前,它不会编译 我知道,异步是一个实现细节,它可以在派生类型中更改,但这不是生成代码的原因,因为生成的代码最初不会编译 是否可以关闭此行为,例如使用一些VS设置

如果您试图通过键入override+从列表中选择FooAsync来覆盖FooAsync,VS 2013代码编辑器将生成以下代码:

    public override async Task FooAsync()
    {
        return base.FooAsync();
    }
显然,在将return改为wait之前,它不会编译

我知道,异步是一个实现细节,它可以在派生类型中更改,但这不是生成代码的原因,因为生成的代码最初不会编译

是否可以关闭此行为,例如使用一些VS设置?

我认为没有办法改变此行为。要添加的代码来自一个代码段,可以在我的计算机上的c:\Program Files x86\Microsoft Visual Studio 12.0\vc\Snippets\1033\Refactoring\MethodOverrideSub.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似乎可以解决这个问题,但与您的提问方式相反——它避免了将异步复制到签名中,这更正确,因为异步确实不应该被视为方法签名的一部分,正如我想您在问题中提到的那样;这是一个实现细节,更改方法的实现方式不应影响签名。

@Damien\u不信者:谢谢。你能把你的评论变成答案吗?