gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:31:29 26 4
gpt4 key购买 nike

我一直在查看与 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com