关于c#:找不到扩展方法

Extension method not found

我有一个控制台应用程序的单一模块,在单独的Extensions名称空间和类中有一个扩展方法,在using Extensions;DataProcessor类中引用,在删除无关代码的情况下有效地如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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"的定义,并且找不到接受"int"类型的第一个参数的扩展方法"ordinal"(是否缺少using指令或程序集引用?)

有人能告诉我我做错了什么吗?


您的方法不是扩展方法。在第一次辩论之前,它错过了this

1
public static string Ordinal(this int Number)

Their first parameter specifies which type the method operates on, and the parameter is preceded by the this modifier.

from Extension Methods (C# Programming Guide)


您需要像这样更改函数:

1
public static string Ordinal(this int Number)

注意this关键字。当您拥有的函数是扩展时,这是必需的。


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

1
public static string Ordinal(this int Number)

它们的第一个参数指定该方法对哪种类型进行操作,并且该参数前面是该修饰符。只有在使用using指令将命名空间显式导入源代码时,扩展方法才在作用域中。


你忘了这个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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;
        }
    }