2017-02-22 13 views
9

Tôi đang chạy chương trình sau đây trên hai máy khác nhau:Phương pháp ẩn danh trong lớp tĩnh là không tĩnh? Làm thế nào để gọi nó?

static class Program 
{ 
    static void Main(string[] args) 
    { 
     Func<int> lambda =() => 5; 
     Console.WriteLine(lambda.GetMethodInfo().IsStatic); 
     Console.ReadLine(); 
    }   
} 

Trên một máy, với .NET 4.5 và Visual Studio 2012 cài đặt này sẽ in "true", vào nhau, với .NET Framework 4.6.2 và Visual Studio 2015 nó in "sai".

Tôi nghĩ rằng các phương thức ẩn danh là tĩnh nếu chúng được định nghĩa trong ngữ cảnh tĩnh. Sự thay đổi này (theo cách được ghi chép) có trong một số cập nhật khung cuối cùng không?

Những gì tôi cần làm là sử dụng Expression.Call trên lambda.GetMethodInfo() và trong trường hợp không phải điều này yêu cầu một phiên bản mà lambda được xác định. Nếu tôi muốn sử dụng lambda.GetMethodInfo().Invoke Tôi sẽ phải đối mặt với cùng một vấn đề.

Tôi làm cách nào để có được một phiên bản như vậy?

+0

Nhưng mục tiêu của bạn là gì? Kết quả mong đợi là gì? –

Trả lời

9

Hãy nhớ rằng điều này (lambdas) là một tính năng trình biên dịch vì vậy phiên bản khung thời gian chạy sẽ không tạo sự khác biệt. Ngoài ra, bởi vì đây là một tính năng trình biên dịch, nó không phải là tất cả những gì đáng ngạc nhiên rằng có một sự khác biệt giữa năm 2012 và 2015 (khi Roslyn được giới thiệu mà thay thế hầu hết các cơ sở hạ tầng trình biên dịch hiện có).

Tôi không thể đưa ra lý do chắc chắn tại sao nó được thay đổi cụ thể tại đây (mặc dù tôi biết một số thay đổi đã được thực hiện cho phép Chỉnh sửa và tiếp tục hoạt động trong nhiều ngữ cảnh hơn), nhưng chưa bao giờ được hợp đồng cách lambdas được thực hiện.

Tôi làm cách nào để có được ví dụ như vậy?

Vâng, lambda là một Delegate và luôn phơi bày tài sản Target tham chiếu đến cá thể khi đại biểu bị ràng buộc.

+0

Đó là nó, cảm ơn bạn. Dựa trên câu trả lời của bạn, tôi tìm thấy một số tài liệu trong github Roslyn. Điều này có vẻ là một cải tiến hiệu suất: https://roslyn.codeplex.com/workitem/246 – Jens

0

Làm thế nào tôi có thể nhận được như một thể hiện

Tôi không chắc chắn nó quan trọng? Chắc chắn bạn có thể chạy các chức năng lambda bằng cách đơn giản làm điều này (ví dụ)

Console.Print(lambda());

Vì vậy, thực tế là nó là tĩnh hay không phần lớn là không đáng kể.

+0

Tôi cần phải sử dụng 'Expression.Call', tôi không thể chỉ đơn giản gọi nó. – Jens

+0

@Jens đủ công bằng – SpaceUser7448

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