必须初始化隐式类型的局部变量:范围定义

时间:2016-07-25 11:17:35

标签: c# interface

我有一个代码,我需要声明一个“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 try之外声明var,因为我必须检查类型转换并相应地更改类型。

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

我甚至无法将try块外的var启动为null。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

有两个回报而不是一个:

 public $jsOptions = ['position' => \yii\web\View::POS_HEAD];

同时

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

 $this->registerJs('js/myjsfile.js', $this::POS_HEAD);

<强>此外 因为你必须有两个返回类型必须符合的返回类型,你可能会这样做(但不建议这样做):

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

答案 1 :(得分:0)

从清洁代码角度来看,最佳方法是定义Type1type2实现的通用接口:

interface IFoo
{
    MyType Function();
}

现在您无需切换类型,可以轻松定义result try/catch,让finally正确处理:

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