2016-08-16 29 views
8

Bối cảnh:Tại sao tôi không thể gọi phương thức mở rộng là phương thức tĩnh khi sử dụng nhập tĩnh?

Tôi có lớp tĩnh, nhưng phương pháp tĩnh không phải là phương pháp mở rộng. Tôi quyết định tái cấu trúc các phương thức thành các phương thức mở rộng và không mong đợi bất kỳ mã nào bị phá vỡ vì các phương thức mở rộng có thể được gọi là các phương thức tĩnh. Tuy nhiên, mã đã phá vỡ khi nhập tĩnh được sử dụng cho lớp tĩnh giữ các phương thức mở rộng.

Ví dụ:

Tôi có một lớp tĩnh với một phương pháp mở rộng và một phương pháp tĩnh:

namespace UsingStaticExtensionTest.Extensions 
{ 
    static class ExtensionClass 
    { 
     internal static void Test1(this Program pg) 
     { 
      System.Console.WriteLine("OK"); 
     } 

     internal static void Test2(Program pg) 
     { 
      System.Console.WriteLine("OK"); 
     } 

    } 
} 

Khi tôi sử dụng chỉ thị sử dụng sau đây, tất cả mọi thứ trong chương trình thử nghiệm hoạt động tốt:

using UsingStaticExtensionTest.Extensions; 
namespace UsingStaticExtensionTest 

    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       var p = new Program(); 
       ExtensionClass.Test1(p); // OK 
       p.Test1(); // OK 
       ExtensionClass.Test2(p); // OK 
      } 
     } 
    } 

Nhưng khi tôi sử dụng nhập tĩnh bằng chỉ thị để chỉ xác định lớp học với các phương pháp khuyến nông, tôi không thể gọi phương thức mở rộng như một phương pháp tĩnh:

using static UsingStaticExtensionTest.Extensions.ExtensionClass; 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var p = new Program(); 
      //Test1(p); // Error: The name Test1 does not exist in the current context 
      p.Test1(); // OK 
      Test2(p); // OK **I can still call the static method** 
     } 
    } 
} 

Câu hỏi: Tại sao tôi không thể gọi một phương pháp mở rộng như một phương pháp tĩnh khi sử dụng nhập tĩnh ?

+0

Có lẽ một những đứa về việc xử lý ở đây cú pháp, cú pháp cho một phương pháp mở rộng đòi hỏi một biểu thức để gọi phương pháp khuyến nông trên. Nói cách khác, bên trong một lớp bạn không thể đơn giản làm 'ExtensionMethod();'; và ngụ ý 'this.'. Có vẻ như việc thực thi cú pháp này cho một phương thức mở rộng sẽ vượt quá mức nhập tĩnh. –

Trả lời

8

Do thiết kế ngôn ngữ:

Sử dụng tĩnh làm cho phương pháp mở rộng khai báo trong quy định loại sẵn cho tra cứu phương pháp khuyến nông. Tuy nhiên, tên của các phương pháp mở rộng không được nhập vào phạm vi cho tham chiếu không đủ tiêu chuẩn trong mã.

using Directive

+0

Câu trả lời hay. Có ai biết lý do cho việc này không? Dường như truy cập trực quan về nguyên tắc, nhưng tôi có thể thiếu một cái gì đó. –

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