是否可以使用也具有out参数的扩展方法?

时间:2012-08-01 07:54:55

标签: c# .net extension-methods visual-studio-2012

示例:

public static string BoolToYesOrNo(this bool text, out string outAsHtmlName)
{
    string[] choices = { "Yes", "No", "N/A" };
    switch (text)
    {
        case true: outAsHtmlName = choices[0]; return choices[0];
        case false: outAsHtmlName = choices[1]; return choices[1];
        default: outAsHtmlName = choices[2]; return choices[2];
    }
}

抛出一个异常,没有重载......需要1个参数,尽管我使用了2个参数。

myBool.BoolToYesOrNo(out htmlClassName);

这是一个确切的例外:CS1501:方法'BoolToYesOrNo'没有重载需要1个参数。

5 个答案:

答案 0 :(得分:2)

这对我的代码很好用:

static void Main()
{
    bool x = true;
    string html;
    string s = x.BoolToYesOrNo(out html);
}

最有可能的是,您缺少using指向声明BoolToYesOrNo类型的命名空间的指令,因此请添加:

using The.Correct.Namespace;

到代码文件的顶部,其中:

namespace The.Correct.Namespace {
    public static class SomeType {
        public static string BoolToYesOrNo(this ...) {...}
    }
}

答案 1 :(得分:1)

我以这种方式尝试了您的代码,它没有任何例外,我唯一要指出的是giving a parameter with out然后您不需要该方法来执行任何return of string

    bool b = true;
    string htmlName;
    string boolToYesOrNo = b.BoolToYesOrNo(out htmlName);

答案 2 :(得分:0)

这就是我测试它的方法:

  1. 我在Visual Studio 2012 RC中创建了一个新的C#控制台应用程序(框架4.5)
  2. program.cs更改为
  3. (省略using s)

    namespace ConsoleApplication1
    {
        public static class testClass
        {
            public static string BoolToYesOrNo(this bool text, out string outAsHtmlName)
            {
                string[] choices = { "Yes", "No", "N/A" };
                switch (text)
                {
                    case true: outAsHtmlName = choices[0]; return choices[0];
                    case false: outAsHtmlName = choices[1]; return choices[1];
                    default: outAsHtmlName = choices[2]; return choices[2];
                }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                bool b = true;
                string result = string.Empty;
                string retval = b.BoolToYesOrNo(out result);
                Console.WriteLine(retval + ", " + result); //output: "Yes, Yes";
            }
        }
    }
    
    1. 我按F5运行程序。代码完美运行。所以,你的方法实际上是正确的,并且有一些错误......好吧,其他地方。仔细检查大括号,有时如果你错过了一个你会得到奇怪的错误。

答案 3 :(得分:0)

我只是粘贴您的代码,它工作正常。我尝试了.net 3.5和4.0,没有显示编译错误,结果是正确的。

为什么这是一种重载方法?

答案 4 :(得分:0)

在MS论坛上找到答案,是一个vs 2012 bug,安装2012年7月更新后,一切正常。谢谢。