【问题标题】:How to Fix "Not all code paths return a value"?如何修复“并非所有代码路径都返回值”?
【发布时间】:2010-09-23 18:17:53
【问题描述】:

我有一个对象数组,我要返回以在不同的方法中使用对象,但是由于某种原因它说“并非所有代码路径都返回一个值”

这是代码......

private object[] runTests(string banText, object tabControlName, int runThisTest, string testName)
    {
        if (stopTests == false)
        {
            var tabPageBrowser = new TabPage();
            var Browser = new WebBrowser();

            (tabControlName as TabControl).TabPages.Add(tabPageBrowser);
            tabPageBrowser.Name = tabControlName.ToString();
            tabPageBrowser.Text = testName;
            tabPageBrowser.Font = new System.Drawing.Font("Trebuchet MS", 8.25F,
                System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            Browser.Dock = DockStyle.Fill;
            Browser.Url = new Uri(testStrings(runThisTest, banText));
            Browser.Name = tabControlName.ToString();
            Browser.ScriptErrorsSuppressed = true;
            tabPageBrowser.Controls.Add(Browser);

            try
            {
                while (Browser.ReadyState != WebBrowserReadyState.Complete)
                {
                    Application.DoEvents();
                }
            }
            catch
            {
                return null;
            }
            IntPtr pHandle = GetCurrentProcess();
            SetProcessWorkingSetSize(pHandle, -1, -1);

            object[] browserObjects = new object[2];
            browserObjects[0] = tabPageBrowser;
            browserObjects[1] = Browser;

            if (browserObjects != null)
            {
                return browserObjects;                    
            }
        }
    }

我看不出我做错了什么,你能帮忙吗?谢谢!

【问题讨论】:

  • 其中一个问题是关于 browserObjects 的 if 语句,它永远不能为空,但在编写语句时,您会创建一个不返回值的路径。

标签: c# arrays object


【解决方案1】:

如果方法不返回

stopTests == 真

- 或 -

browserObjects == null

【讨论】:

  • ...只是为了澄清 - C# 中每个返回值的方法必须在每个结束时都有一个显式的return 语句(或抛出的异常)代码路径。
  • @Michael:还是无限循环;编译器会将“while(true){}”视为具有无法到达的端点。将其表述为:非 void 方法的终点一定不可到达。
  • @Eric:是的,这很有逻辑意义,但我不确定方法的“终点”这个概念有多普遍。
  • @Michael:方法的终点是词法上结束主体的大括号;我不认为这是一个特别深奥的概念。
  • @Nico:不,我的意思是我说的。让我重新声明一下。如果非 void 方法的终点是可到达的,则该方法可以终止而不返回值。非 void 方法在不返回值的情况下终止是不合法的,除非通过异常。因此,非 void 方法的终点一定是不可到达的。现在清楚了吗?
【解决方案2】:

提示:尝试查找不通过任何return 的路径。

【讨论】:

    【解决方案3】:

    在所有代码路径中返回一个值

    【讨论】:

      【解决方案4】:

      Getter 或访问器方法必须始终返回原始值或对象。

      在你的例子中,你说的是

      private object[] runTests(...) // Which means that no matter what, this method must return object[] or throw an exception
      

      比你有条件:

      if(my_condition_is_met)
      {
       do_some_processing();
      }
      

      现在,如果不满足条件,那么您将不会返回任何内容,而在第一行中我们已经说过我们将返回对象数组。

      原始,但希望有意义...

      【讨论】:

        【解决方案5】:

        在您的代码中,您没有其他部分,所以在这里我将返回 null。

            if (stopTests == false) 
            {
                //your code 
            }
            else
                return null;
        

        【讨论】:

          【解决方案6】:
          return browserObjects;     
          

          放弃 if 语句。从技术上讲,if 语句总是会命中,但编译器并没有那么深(虽然代码合同会那么深)

          【讨论】:

            猜你喜欢
            • 2023-01-29
            • 2011-12-17
            • 1970-01-01
            • 1970-01-01
            • 2021-11-08
            • 2013-10-06
            • 2016-02-14
            相关资源
            最近更新 更多