2015-07-31 4 views
-1

У меня есть один модуль для консольного приложения с методом расширения в отдельном Extensions пространства имен и классе, упомянутых в DataProcessor классе с using Extensions;, эффективно следующимом посторонним кодом удален:метода Extension не найден

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace DataProcessor 
{ 
    using Extensions; 
    class Program 
    { 
     public static int Main(string[] Args) 
     { 
       for (int CtrA = 0; CtrA <= 100; CtrA++) 
       { 
        System.Diagnostics.Debug.Print((CtrA + 1).Ordinal);  // Error occurs here 
       } 
     } 
    } 
} 

namespace Extensions 
{ 
    public static class Extensions 
    { 
     public static string Ordinal(int Number) 
     { 
      string Str = Number.ToString(); 
      Number = Number % 100; 
      if ((Number >= 11) && (Number <= 13)) 
      { 
       Str += "th"; 
      } 
      else 
      { 
       switch (Number % 10) 
       { 
        case 1: 
         Str += "st"; 
         break; 
        case 2: 
         Str += "nd"; 
         break; 
        case 3: 
         Str += "rd"; 
         break; 
        default: 
         Str += "th"; 
         break; 
       } 
      } 
      return Str; 
     } 
    } 

Я получаю ошибку компиляции на линии System.Diagnostics.Debug.Print((CtrA + 1).Ordinal);, а также везде я использую .Ordinal как int метод, заявив:

«INT» не содержит определение для «Порядковый» и без расширения встретились hod 'Ordinal', принимающий первый аргумент типа 'int', может быть найден (вам не хватает директивы использования или ссылки на сборку?)

Может ли кто-нибудь сказать мне, что я делаю неправильно?

+0

Вы забыли поставить ключевое слово 'this' в' Ordinal' signiture. –

+2

Вероятно, должен быть дубликат [Поддерживает свойства расширения C#] (http://stackoverflow.com/questions/619033/does-c-sharp-have-extension-properties) ... Пока не закрывается, так как неясно, будет ли OP не знает синтаксиса расширений (должен быть еще один дубликат) или на самом деле нужен свойство расширения. –

ответ

5

Вы не метод расширения. Это пропускает this перед первым аргументом:

public static string Ordinal(this int Number) 

Их первый параметр определяет, какой тип метод работает на и параметра предшествует this модификатора.

из Extension Methods (C# Programming Guide)

+0

Хороший ответ, также не собирающийся помогать ОП, поскольку они хотят собственности, а не метода ... –

2

Перед любыми параметрами необходимо добавить this.

public static string Ordinal(this int Number) 

Их первый параметр указывает, с каким типом работает метод, а перед этим параметром предшествует этот модификатор. Методы расширения доступны только в том случае, если вы явно импортируете пространство имен в исходный код с помощью директивы using.

3

Вы должны изменить функцию так:

public static string Ordinal(this int Number) 

Обратите внимание на ключевое слово this. Это необходимо, если у вас есть расширение.

0

Вы забыли это.

namespace Extensions 
{ 
    public static class Extensions 
    { 
     public static string Ordinal(this int Number) 
     { 
      string Str = Number.ToString(); 
      Number = Number % 100; 
      if ((Number >= 11) && (Number <= 13)) 
      { 
       Str += "th"; 
      } 
      else 
      { 
       switch (Number % 10) 
       { 
        case 1: 
         Str += "st"; 
         break; 
        case 2: 
         Str += "nd"; 
         break; 
        case 3: 
         Str += "rd"; 
         break; 
        default: 
         Str += "th"; 
         break; 
       } 
      } 
      return Str; 
     } 
    } 
Смежные вопросы