【问题标题】:Not All Code Path Return Value in Func<> Generic Type Delegate并非 Func<> 泛型类型委托中的所有代码路径返回值
【发布时间】:2013-07-11 11:27:11
【问题描述】:

我是新的泛型类型委托并尝试实现 Func 泛型类型委托

我正在开发 winform 应用程序,我尝试在其中保存文件,我的保存函数返回布尔值(真/假)。我知道在没有泛型委托的情况下实现它非常简单,但我想在我的代码中实现泛型委托

public bool Save( string fileName, SaveFlags options)
{
    if (fileName == null) throw new ArgumentNullException("file");
    using (FileStream fs = File.Create(fileName))
    {
        Func<string, SaveFlags, bool> func2 = (fileStream, opt) => Save(fs , options);
       **// what should I need to return**  
    }
}

private bool Save(Stream iStream, SaveFlags options)
{
   **//Some operation perform and return TRUE or FALSE**

}

我知道无论 Func 的最后一个输出参数如何,它都会成为 Func 的返回类型,即它由 Func 返回。

那么我该如何处理错误"Not All Code Path Return Value"

【问题讨论】:

  • 你的代码没有意义。
  • 为什么要使用泛型 Func?

标签: c# generics


【解决方案1】:

首先,您正在研究无限递归。从您的 lambda 参数名称中,您打算附加到接受 Stream 的重载。但是Func&lt;string, SaveFlags, bool&gt; 意味着您将接受string 的重载。

接下来,如果你的委托带参数,你不需要捕获当前函数调用的参数。所以 lambda 根本没有帮助。

考虑到这一点:

public bool Save( string fileName, SaveFlags options)
{
    if (fileName == null) throw new ArgumentNullException("file");
    Func<Stream, SaveFlags, bool> func2 = Save;
    using (FileStream fs = File.Create(fileName))
    {
        return func2(fs, options);
    }
}

【讨论】:

    【解决方案2】:

    调用你的函数。

    public bool Save( string fileName, SaveFlags options)
    {
        if (fileName == null) throw new ArgumentNullException("file");
        using (FileStream fs = File.Create(fileName))
        {
            Func<string, SaveFlags, bool> func2 = (fileStream, opt) => Save(fs , options);
            return func2(fileName, options);
        }
    }
    

    【讨论】:

    • 您的代码使代码编译(按照 OP 的要求),但是在这种形式下,Func 的使用是非常无用的。
    【解决方案3】:

    您应该使用参数执行 func2 并返回其结果。 您还需要修复您的委托。

    Func<Stream, SaveFlags, bool> func2 = (fileStream, opt) => Save(fileStream, opt);
    return func2(filename, options);
    

    如果您不修复委托,您将创建 func2,它接受两个参数并忽略它们。

    【讨论】:

      【解决方案4】:

      检查这个解决方案

       public bool Save(string fileName, SaveFlags options)
              {
                  if (fileName == null) throw new ArgumentNullException("file");
                  using (FileStream fs = File.Create(fileName))
                  {
                      Func<string, SaveFlags, bool> func2 = (fileStream, opt) => Save(fs, options);
                      return func2(fileName, options);
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        • 1970-01-01
        相关资源
        最近更新 更多