C#类型的尾随点表示什么?

时间:2013-08-05 13:52:25

标签: c# .net razor reflection

我一直在查看与Razor View引擎关联的调试器中的一些代码,我注意到一些类型出现在Debugger中,在类型名称的末尾有一个尾随点字符,例如:

{Nancy.ViewEngines.Razor.RazorViewEngine}

有谁知道这表明了什么?在对象上指定强制转换时使用它是无效的语法,所以我对它在调试器中的含义感到好奇。

编辑:根据@Damien_The_Unbeliever的要求,调试器中变量的屏幕截图:

Debug Image

我正在查看的代码:

public TCompiledView GetOrAdd<TCompiledView>(
            ViewLocationResult viewLocationResult, Func<ViewLocationResult, TCompiledView> valueFactory)
        {
            TCompiledView compiledView = default(TCompiledView);
            compiledView = (TCompiledView)this.cache.GetOrAdd(viewLocationResult, x => valueFactory(x));

为了提供更多背景信息,我们尝试将日志记录添加到我们的Nancy View Cache中,以调查Razor Views抛出编译错误的间歇性问题,但这与问题无关。

1 个答案:

答案 0 :(得分:12)

我已经看到这种情况发生在变量/值实际上是编译器生成的类型时(例如,用于保存由lambda,async,iterator等捕获的“局部变量”)。调试器(在各个地方)似乎无法显示实际的类名。


E.g。这个示例程序:

class Program
{
    static void Main(string[] args)
    {
        var p = new Program();
        p.DoStuff();
    }

    void DoStuff()
    {
        int i = 19;
        Expression<Func<int>> j = () => i + 10;
        var k = (((j.Body as BinaryExpression).Left as MemberExpression).Expression as ConstantExpression).Value;
        Console.ReadLine();
    }
}

Console.ReadLine()上有一个断点,您会发现k类的类型看起来像Program.而不是Program+<>_DisplayClass0


由Jeppe添加:此示例略微简化了上述内容,避免了表达式树。查看委托实例的Target,它将是生成的类的实例。为了比较,还要查看迭代器块类型:

using System;
using System.Collections.Generic;

static class Program
{
  static void Main()
  {
    int i = 19; // to be captured by lambda, will become field on a generated class
    Func<int> f = () => i;
    var target = f.Target;  // when debugging type looks like "Program."
    Console.WriteLine(target.GetType().ToString()); // writes "Program+<>c__DisplayClass1"

    var seq = GetSeq();  // when debugging type looks like "Program.GetSeq"
    Console.WriteLine(seq.GetType().ToString()); // writes "Program+<GetSeq>d__3"
  }

  static IEnumerable<int> GetSeq() // returns "state machine" (iterator block)
  {
    yield return 42;
  }
}