在包含块之外对out变量声明的引用存在问题

编程语言 2026-07-09

我在实现一个小型脚本语言时,遇到了一个非常怪异的情况。

请看这个函数:

public void Run()
{
    Dictionary<string, System.Reflection.MethodInfo> data = new();

    if (!data.TryGetValue("foo", out System.Reflection.MethodInfo? methodInfo))
    {
        throw new Exception($"Function '' not found in function map.");
    }

    MiniscriptFunctionAttribute? attribute = methodInfo.GetCustomAttribute<MiniscriptFunctionAttribute>();

    methodInfo.Invoke(vm.Implementation, null);
}

我想做的是创建一个函数映射,借助反射来方便地引用和调用一个函数。当然,上面的函数使用了一个局部映射,但这是我试图把错误简化到最简单的示例的结果。

结果是在编译时会得到如下错误:

这是一段代码的图片

12>S:\dfs\saintaveline\MiniscriptConsole\Program.cs(39,65,39,112): error CS1061: 'MethodInfo' does not contain a definition for 'GetCustomAttribute' and no accessible extension method 'GetCustomAttribute' accepting a first argument of type 'MethodInfo' could be found (are you missing a using directive or an assembly reference?)

这很奇怪,因为 MethodInfo 确实具备那种方法。更奇怪的是,我居然可以把有问题的那一行粘贴到现有行下面,把第二个 attribute 重命名为 attribute2,错误就消失了!

从那里开始,我可以删除新加入的 attribute2,错误也不会再出现!尽管它的代码完全一样。

我不敢说这是C#的一个bug,但现在感觉确实像。我知道我的解释可能并不太好(英语不是我的第一语言),所以我给出一个视频链接,里面我解释得更清楚: https://www.youtube.com/watch?v=RP6TdRdMDUU&t=3499s

为保险起见,下面给出属性类:

[AttributeUsage(AttributeTargets.Method)]
public class MiniscriptFunctionAttribute : Attribute
{
    public string Name { get; }
    public int ParamCount { get; }

    public MiniscriptFunctionAttribute(string name, int paramCount)
    {
        Name = name;
        ParamCount = paramCount;
    }
}

解决方案

我想我找到了答案 :) 我仔细看完你的视频,注意到那一行

MiniscriptFunctionAttribute? attribute = methodInfo.GetCustomAttribute<MiniscriptFunctionAttribute>();

在第47行。

当你把它复制粘贴到下一行时,在 58:51标记 的位置,行号会从47跳到48,你粘贴的那一行现在是第49行。

这是因为Visual Studio有一个功能,会自动为粘贴的代码添加必要的 using 指令。

因此,当你复制粘贴新的一行时,它会自动添加必要的 using 指令,从而导致行号“跳跃”一行。

另外,这也解释了为什么按ctrl+z会重新出现问题,因为它会把粘贴以及自动添加的 using 一并撤销。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章