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

标签 c# .net razor reflection

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

{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 抛出编译错误的间歇性问题,但这与问题并不真正相关。

最佳答案

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


例如这个示例程序:

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 添加: 这个例子是对上面的例子的轻微简化,避免了表达式树。查看委托(delegate)实例的 Target这将是生成类的实例。为了进行比较,还查看了迭代器 block 类型:

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;
  }
}

关于c# - C# 类型上的尾随点表示什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18059906/

相关文章:

c# - 定位图形绘制

c# - 附加而不是覆盖 Web API 列表

c# - 带条件 where 子句的 LINQ

c# - 如何处理 .net core 3.1 自包含单文件发布的 Appsettings

c# - 为什么在 Expression.Call 上构建的编译 lambda 比应该做同样事情的委托(delegate)稍慢?

c# - IHttpAsyncHandler 和 Request.Filter

asp.net-mvc - CSS 选择器 : last-child not working when added with a FOR loop

asp.net - (.NET Core 1.0 && net46) Visual Studio 中的 View 类中的 MVC 错误

c# - StaticPagedList 以及 POST 表单 : No parameterless constructor defined for this object

c# - 在 C# 中引用 VBA 程序集