2013-08-16 4 views
0

Только что я читал о методах расширения. Я создал статический метод внутри статического класса, работающий отлично.Метод расширения не работает, если метод нестатического класса?

static class ExtensionMethods 
    { 
     public static string splitFirstName(this string strName) 
     { 
      return strName.Split(" ".ToCharArray())[0]; 
     } 
    } 

Но если я создаю статический метод внутри нестатического класса, он не работает.

class NonStaticCls 
    { 
     public static string splitFirstName(this string strName) 
     { 
     return strName.Split(" ".ToCharArray())[0]; 
     } 
    } 

Сообщите, пожалуйста, почему он не работает в нестатических классах.

ответ

6

Пожалуйста скажите, почему он не работает в нестатическом классе.

Потому что это именно то, как указаны методы расширения. Они должны быть объявлены не-вложенным, не общим классом.

Из секции 10.6.9 спецификации C# 5:

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

Почему вы хотите объявить его в не статическом классе? Чего вы пытаетесь достичь, чего нельзя достичь одинаково хорошо, используя статический класс? (Я могу просто о возможностях, но это не то, что я когда-либо хотел делать в методах расширения самостоятельно ...)

+0

'static class ExtensionMethods' не объявлен в статическом классе? –

+0

@GuruStron: Да, внимательно прочитайте вопрос - эта версия работает, но второй фрагмент кода этого не делает. –

+0

да, я вижу спасибо)) –

2

Это по дизайну Поведение. Метод расширения может быть объявлен только в статическом классе.

How to: Implement and Call a Custom Extension Method (C# Programming Guide)

Для определения и вызова метода расширения

  1. Определить статический класс содержит метод расширения.
+0

'static class ExtensionMethods', как я вижу, метод определен в статическом классе –

+0

@GuruStron - перечитайте вопрос. Первый пример кода работает (поскольку он * является * 'static'), OP спрашивает, почему образец кода * second * не работает. –

+0

yeah, thx, my bad –

3

Требование, чтобы класс был static. Это разумно. Если бы это был не статический класс, вы могли бы (потенциально) создать экземпляры этого класса. Но тогда в нем есть методы расширения, возможно, для других, совершенно не связанных между собой классов. Это может быть очень запутанным.

2

Похоже, что это по дизайну.

От MSDN;

Ниже приведены основные характеристики статического класса:

  • Содержит только статические члены.

  • Невозможно создать экземпляр.

  • Запечатан.

  • Не может содержать конструкторы экземпляров.

Заканчивать этот ответ от Eric Липпертого

Кроме того, из AskJonSkeet

Это продиктовано в спецификации языка, раздел 10.6.9 из C# 4 spec:

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

+0

Вы указали функции статического класса - не ограничения на методы расширения. –

+0

@JonSkeet Спасибо, Джон, обновлено. [AskJonSkeet.com] (http://askjonskeet.com/) все еще активен кстати? –

+0

Да, насколько мне известно. (Я не запускаю его.) –

1

Согласно спецификации C#. Вы можете прочитать здесь Extension Methods

методы расширения могут быть объявлены только в нетипичных, невложенных статических классов.

AS другой указал, что вам необходимо включить статический.

в основном вы будете создавать кучу метода расширения, как утилита проекта или вспомогательный класс

  1. Создание статического класса вам не нужно инстанцирован и вызвать метод непосредственно. для Eg. Math.Pow()
  2. согласно вашему вопросу, метод расширения работает только в том случае, если он находится в статическом классе. и использование правильного пространства имен.
Смежные вопросы