在包含块之外对out变量声明的引用存在问题
我在实现一个小型脚本语言时,遇到了一个非常怪异的情况。
请看这个函数:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。