找不到扩展方法

时间:2015-07-31 05:35:17

标签: c# extension-methods

我有一个控制台应用程序的单个模块,在单独的Extensions命名空间和类中使用扩展方法,在DataProcessor类中使用using Extensions;引用,实际上如下所示代码已删除:

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'不包含'Ordinal'的定义,并且没有扩展方法'Ordinal'接受类型'int'的第一个参数可以找到(你是否缺少using指令或汇编引用?)

谁能告诉我我做错了什么?

4 个答案:

答案 0 :(得分:5)

您的方法不是扩展方法。它在第一个参数之前错过了this

public static string Ordinal(this int Number)
  

它们的第一个参数指定方法操作的类型,参数前面有this修饰符

     来自Extension Methods (C# Programming Guide)

答案 1 :(得分:3)

你需要改变这样的功能:

public static string Ordinal(this int Number)

请注意this关键字。当您拥有的功能是扩展名时,这是必需的。

答案 2 :(得分:2)

您必须在任何参数之前添加this

public static string Ordinal(this int Number)

它们的第一个参数指定方法操作的类型,参数前面有this修饰符。当您使用using指令将命名空间显式导入源代码时,扩展方法仅在范围内。

答案 3 :(得分: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;
        }
    }