繁体   English   中英

重写异步方法时的错误代码。 可以关闭此行为吗?

[英]Erroneous code, when overriding async method. Can this behavior be turned off?

让我们考虑这个类:

public class A
{
    public virtual async Task FooAsync()
    {
        await Task.Delay(3000);
    }
}

如果您尝试通过键入“ override” FooAsync从列表中选择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实际上应该正如我认为您自己在问题中所提到的那样,它被视为方法签名的一部分; 这是一个实现细节,更改方法的实现方式不应影响签名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM