使用MonoDevelop 2.8.5的单声道和扩展方法

时间:2011-12-17 12:06:31

标签: mono extension-methods monodevelop

我在一个包含System.Core和构建目标Mono / .NET 3.5的项目中编写了一个MD 2.8.5的单元测试。我非常喜欢新的NUnit的Assert.Throws,因此决定为它编写一个扩展方法。我创建了一个新文件,其中包含与测试相同的命名空间中的内容。任何人都可以看到我的错误吗?

public delegate void TestDelegate();

public static class AssertThrows
{
    public static T Throws<T>(this Assert assert, TestDelegate td)
        where T : Exception
    {
        try
        {
            td();
        }
        catch(T e)
        {
            return e;
        }
        catch
        {
            throw new AssertionException("Wrong exception type.");
        }
        throw new AssertionException("Did not throw an error.");
    }
}

MonoDevelop通过代码完成“看到”扩展方法。但是,编译器会报告:

Performing main compilation...
/Users/shamwow/dev/EngineTests.cs(19,37): error CS0117:
  `NUnit.Framework.Assert' does not  contain a definition for `Throws'
/Applications/MonoDevelop.app/Contents/MacOS/lib/monodevelop/AddIns/NUnit/nunit.framework.dll (Location of the symbol related to previous error)


Build complete -- 1 error, 0 warnings

(我知道MD和Mono不一样。)

1 个答案:

答案 0 :(得分:4)

我假设您正在尝试使用它:

Assert.Throws<FooException>(() => ...);

扩展方法不起作用 - 它们似乎是扩展类型上的实例方法。由于您没有Assert实例,因此无法像这样调用您的扩展方法。