3

我有一个带有泛型方法的非泛型类。此方法的泛型类型定义了输出类型,无法从使用中推断出来,因此我必须显式提供泛型类型。有时这种类型是从通用调用者的方法类型参数传递的,但在一个实例中,我必须自己显式地提供它。

问题是当我调用我明确提供的泛型类型方法调用时,它似乎没有被执行并返回一个完全不相关的类型。我无法调试此调用并获得无效结果。但它并没有破坏特别奇怪的执行。当从调用者的泛型方法类型传递泛型类型的其他地方调用相同的方法时,一切似乎都按照定义工作。

我完全失去了发生了什么。

我在接口中的方法定义(稍后在类中实现):

TRecord Update<TRecord>(int recordId, int? categoryId, string categoryName, string title)
    where TRecord : Record;

我的Record类是非抽象的,并且只有一种继承自它的类型:

public class Record : ProtectedEntity
{
    ...
}

public class RelatedRecord<T> : Record
{
    public IList<T> Related { get; private set; }
    ...
}

我正在调用我的方法:

var record = myRepo.Update<Record>(...);

当执行到这一行时,我点击F11调试它,但执行只是跳转到下一句。当我检查我record的变量时,它不是类型Record,而是System.String具有参数的值categoryName。这意味着某些东西确实被执行了,但它绝对不是我的通用方法的主体。

奇怪的是,在其他任何地方,相同的调用都按预期工作。

这怎么解释,我做错了什么?

4

2 回答 2

2

根据您所说的,包括评论:

如果我尝试在运行时访问任何成员,它当然会引发关于非现有成员的异常。

这听起来像是编译器错误或 JIT 错误。这意味着要诊断它,我们需要更多地了解您正在使用的编译器(确切版本)和/或您正在使用的 JIT。在编译器错误的情况下,如果您可以简单地显示已生成的 IL(如果您熟悉的话)就足够了

请注意,最新的 VS 预览版包含一个全新的 JIT (RyuJIT) 并默认启用它 system-wide,所以如果您安装了 VS 预览版,那将是我的猜测。如果是这样,您可以简单地禁用它以进行检查。


请注意,这里的另一个选项类似于using别名Recordto beSystem.String或 aliases varto be System.String(加上一些隐式转换运算符等)。这些不太可能,但我已经看到它发生了;p

编辑:您的评论排除了上述内容:

执行 typeof(Record).FullName 正确返回我的完整类型名称,包括应有的名称空间。

所以我们留下了编译器错误或 JIT 错误。


如果这是一个 RyuJIT 错误,以下是禁用它的选项(我建议首先使用配置,因为它是最容易做到的):

  1. 作为环境变量:设置 COMPLUS_useLegacyJit=1

  2. 在注册表中:设置 HKLM 或 HKCU,Software\Microsoft.NETFramework。键名:useLegacyJit。类型:REG_DWORD。值:1

  3. 在 app.exe.config 文件中:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <runtime>
        <useLegacyJit enabled="1" />
      </runtime>
    </configuration>
    

(这些来自我之前与 MS 的单独讨论)

于 2014-12-30T12:22:56.390 回答
1

如果您没有收到运行时类型异常,我可能会怀疑我遇到的 Visual Studio 调试器中的错误。如果在同一个方法中有两个同名的局部作用域变量,调试器可能会混淆它们:

private void DoSomething(int x)
{
    {
        var s = "STRING!";
        Console.WriteLine(s);
    }
    {
        var s = 5;
        Console.WriteLine(s);
    }
}

我不知道上面的示例是否真的会重现该问题,但我已经看到调试器的行为,您将鼠标悬停在第二个 s 上,它显示为“STRING!”,而不是 5。那将是第一件事我会检查,您在名为“record”的同一方法中没有另一个局部变量。

于 2014-12-30T12:35:27.827 回答