【问题标题】:Implicitly typed local variables must be initialized: scope definition必须初始化隐式类型的局部变量:作用域定义
【发布时间】:2016-07-25 19:53:50
【问题描述】:

我有一段代码需要声明一个“var”变量,因为类型会根据请求而改变。必须在 try 块内进行此声明以捕获任何异常:

try
{
    var calc = (Type1)obj;
    var results = calc.Function();
}
catch
{
    var calc = (Type2)obj;
    var results = calc.Function();
}
finally
{
    return results;
}

现在的问题是,“结果”将不起作用,因为范围在 try catch 块之外结束。我无法在 try 之外声明 var,因为我必须检查类型转换并相应地更改类型。

Type1、Type2 是不同的接口,obj 又是“var”,可以有不同的类型。

我什至无法在 try 块之外将 var 初始化为 null。我怎样才能解决这个问题?

【问题讨论】:

  • 如果您将var 初始化为null,您希望它是什么类型? varobjectdynamic 不同。你真的应该阅读var上的文档,你离理解它还很远。
  • 我知道,我不想将其初始化为空。这不是我主要关心的问题。我正在寻找的只是返回“结果”,它可以是数据集,也可以是基于 try 块执行还是 catch 块执行的数据表。
  • var 可以混淆你的代码,不要滥用它。如果您提及类型,通常会使您的代码更具可读性和可理解性,如果您使用方法的返回类型,则更是如此。
  • 请添加至少 2 个您可能对该方法进行的不同调用的示例,以便我们确定最佳路径

标签: c# interface


【解决方案1】:

有两个返回点而不是一个:

var results = //determine the result type here
 try
{
    var calc = (Type1)obj;
    return calc.Function();
}
catch
{
    var calc = (Type2)obj;
    return calc.Function();
}

您应该在尝试强制转换之前检查 obj 是否属于 Type1 类型以避免异常。 像这样:

if (obj is Type1)
{
    return (obj as Type1).Function();
}
else
{
    return (obj as Type2).Function();
}

此外 因为你必须有一个返回类型,这两种返回类型必须符合,你可以这样做(但不推荐这样做):

var result = //type of return type
    try
{
    var calc = (Type1)obj;
    result  =  calc.Function();
}
catch
{
    var calc = (Type2)obj;
    result = calc.Function();
}
finally
{
return result;
}

【讨论】:

  • 结果可以是数据表,也可以是基于调用的数据集。
  • 无论哪种方式,您的函数返回类型都必须包含它们(返回类型必须与两种可能的结果相反)
  • 感谢您的帮助。我会继续你的建议。
  • 为什么不推荐第一种方法使用您的第三种方法?我在这里看不出有什么不同。
  • 它与第一个类似,但建议使用第二个,因为在 op 示例中,异常用于控制流程而不是处理异常情况
【解决方案2】:

从干净代码的角度来看,最好的方法是定义 Type1type2 实现的通用接口:

interface IFoo
{
    MyType Function();
}

现在您不必切换类型,并且可以轻松地从您的 try/catch 中定义 result 以让 finally 适当地处理它:

MyType result = null;
try
{
    IFoo foo = obj as IFoo;
    results = foo.Function();
}
catch
{
   ...
}
finally
{
    return results;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多