我有一个控制台应用程序的单个模块,在单独的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指令或汇编引用?)
谁能告诉我我做错了什么?
答案 0 :(得分:5)
您的方法不是扩展方法。它在第一个参数之前错过了this
:
public static string Ordinal(this int Number)
它们的第一个参数指定方法操作的类型,参数前面有
来自Extension Methods (C# Programming Guide) 的this
修饰符。
答案 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;
}
}