为什么我无法调用扩展方法?

4

我有这个类:

class Program
{
    static void Main(string[] args)
    {

    }

    public static int SetFlag_Old(this int i, int flag, bool set = true)
    {
        return (set) ? i | flag : ((i & flag) != 0) ? (i - flag) : i;

    }
}

当我把这段代码放在上面的主方法中时,我没有获取调用扩展方法的选项,而且我无法弄清原因。

int i = 0;
i.

即使我创建了一个非静态方法并插入了该代码,我似乎也无法调用扩展方法。我是否错过了一些非常简单的东西?

1
那个不能编译。修复编译错误也会解决你的问题。 - Rune FS
3
错误代码 CS1106:扩展方法必须在非泛型静态类中定义。感觉编译器想告诉我什么……只要它能更具体一些就好了! - Marc Gravell
嗨@Marc,感谢你的讽刺回复。实际上,我没有意识到它没有构建,因为我没有得到通常的错误选项卡。我打开了Visual Studio(新机器),我没有错误列表,所以我只看到黑色和白色的文字,看起来“没问题”。虽然我很感激这些回复,但我真的笑得前仰后合。 - Exitos
@Pete2k,这句话的意思是开玩笑而不是直接讽刺。但是:编译器消息窗格几乎总是查找任何构建失败的第一位置(我可能错了,但我认为如果构建失败,它会自动显示错误窗格;哦好吧)。无论如何,没有任何冒犯之意。 - Marc Gravell
4个回答

15

该扩展方法必须位于静态类中:

public static class IntExtensions 
{
    public static int SetFlag_Old(this int i, int flag, bool set = true)
    {
        return (set) ? i | flag : ((i & flag) != 0) ? (i - flag) : i;
    }
}

http://msdn.microsoft.com/en-us/library/bb383977.aspx


即使您修复了所有问题,也可能不会在Intellisense中显示。只需盲目输入整个方法名称,然后在输入开括号后,Intellisense将向您显示参数。 - Oliver
实际上,它不需要在它自己的类中;只需将其放在一个“静态”类中即可;将“Program”标记为“静态”将实现相同的效果。 - Marc Gravell
@MarcGravell 确实,但我认为最好将其放在自己的类中。不过我已经更新了我的答案。 - Richard Dalton

1

0

这段代码甚至无法编译。它会出现错误:扩展方法必须定义在非泛型静态类中。您需要多少更多的信息呢?我可以为您重新编写:

扩展方法必须定义在非泛型静态类中

我要补充说明的是,您可以将Program类设置为static。考虑到其“入口”方法(Main)是static,我不知道为什么他们没有直接在代码模板中将其设为静态。


0

扩展方法所在的类必须是静态的。请将 static 修饰符添加到 Program 类中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接