2013-08-05 21 views
22

Tôi đã xem xét một số mã trong trình gỡ lỗi liên kết với công cụ Razor View và tôi nhận thấy rằng một số loại xuất hiện trong Debugger có ký tự dấu chấm ở cuối tên loại ví dụ:Dấu chấm trên loại C# cho biết điều gì?

{Nancy. ViewEngines.Razor.RazorViewEngine.}

Có ai biết điều này cho biết không? Cú pháp không hợp lệ để sử dụng nó khi chỉ định một diễn viên trên một đối tượng vì vậy tôi bị hấp dẫn như những gì nó chỉ ra trong trình gỡ rối.

EDIT: Theo yêu cầu của @Damien_The_Unbeliever, ảnh chụp màn hình của biến trong chương trình gỡ rối:

Debug Image

Và đoạn code mà tôi đang tìm tại địa chỉ:

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

Để cung cấp cho một nền ít hơn, chúng tôi đang cố gắng thêm đăng nhập vào bộ đệm ẩn của chúng tôi để xem xét một vấn đề liên tục với Razor Views ném lỗi biên dịch, nhưng điều đó không thực sự liên quan đến nhiệm vụ ion.

+0

Mã tự động tạo thư viện này. System.CodeDom được hiển thị, có thể một số Reflection.Emit một nơi nào đó và bạn đang nửa chừng để giải thích. Chỉ cần gửi báo cáo lỗi với [dự án] (https://github.com/NancyFx/Nancy/issues). –

+0

Cách thực hiện 'ToString() 'ngu ngốc là phỏng đoán của tôi. Kiểm tra nó trên loại thực tế bạn có thể nhìn thấy trong cửa sổ xem. – leppie

+0

@leppie 'ToString' có thể cung cấp một cái gì đó như' "Nancy.ViewEngines.Razor.RazorViewEngine + <> c__DisplayClass1" 'hoặc tương tự. Nó là một lớp lồng nhau '<> c__DisplayClass1' bên trong kiểu' RazorViewEngine' trong không gian tên 'Nancy.ViewEngines.Razor'. Thay vì gọi 'ToString()' trình gỡ rối cố gắng viết lớp ngoài cùng theo dấu chấm (không phải dấu cộng) theo sau là tên lớp bên trong. Xem câu trả lời cập nhật của Damien. –

Trả lời

12

Tôi đã thấy điều này xảy ra khi biến/giá trị thực sự thuộc loại trình biên dịch tạo ra (ví dụ: giữ "biến cục bộ" được ghi bởi lambda, async, iterator, v.v.). Trình gỡ lỗi (ở những nơi khác nhau) dường như không thể hiển thị tên lớp thực tế.


Ví dụ: ví dụ này chương trình:

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

Với một breakpoint trên Console.ReadLine(), bạn sẽ tìm thấy loại lớp của k trông giống như Program. hơn Program+<>_DisplayClass0


Addition bởi Jeppe: Ví dụ này là một việc đơn giản hóa nhẹ ở trên, tránh cây biểu thức. Nhìn vào một ví dụ của đại biểu là Target, nó sẽ là một thể hiện của một lớp được tạo ra. Để so sánh, hãy xem xét loại khối lặp:

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

Vì vậy, bạn đang nói rằng tên kiểu thực sự thực sự là 'Nancy.ViewEngines.Razor.RazorViewEngine.STRANGE_CHARS_HERE', nhưng vì một lỗi tất cả được hiển thị là' Nancy.ViewEngines.Razor.RazorViewEngine.'? –

+1

@JeppeStigNielsen - đó là những gì tôi đã thấy - ví dụ: nếu tên kiểu là '<> displayClass1', một giá trị của kiểu đó chỉ hiển thị tên không gian tên trong cột kiểu. Tất nhiên, nó là một chút khó khăn để có được trường hợp của các loại này, và không có OP hiển thị mã hơn, chúng tôi sẽ không biết nếu đó là trường hợp thực tế ở đây. Thật không may, tạo ra một bản demo ngắn của vấn đề cũng là khó khăn. –

+0

Tôi sẽ cố gắng và tìm thời gian ngay hôm nay để xem qua một trình gỡ rối và chụp ảnh màn hình những gì tôi đang xem, xem không gian này ... –

Các vấn đề liên quan