2015-11-30 95 views
2

我写了一个使用OCR的小代码。我遇到了一个令人困惑的情况,我的变量数据类型var在代码达到初始化之前被初始化。 请看看这张截图
enter image description here在C#中初始化Var#

的代码RecAPIPlus.RecInitPlus(null,null);行应该返回API初始化的状态。该行甚至没有执行,但是我的状态变量似乎有一个默认值,即REC_OK上面的代码行在执行时应该返回。
任何人都可以解释这个原因吗?下面是完整的代码:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Nuance.OmniPage.CSDK; 
namespace OmniPage 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      try 
      { 

       Console.WriteLine(Nuance.OmniPage.CSDK.ZONETYPE.WT_AUTO); 



       var status=RecAPIPlus.RecInitPlus(null,null); 
       IntPtr a; 
       var output = RecAPI.kRecLoadImgF(0, "out.txt", out a, 1); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       Console.WriteLine(e); 
      } 
     } 
    } 
} 
+0

RecInitPlus的返回类型是什么?它返回一个枚举?这个枚举是否有明确的值?如果REC_OK是第一个枚举成员,并且它没有显式值,那么它的值是0,这是默认值。你期望变量在赋值之前有什么价值? –

+0

将'var'想象成一个占位符,编译器会为你填充它。所以它总是有一个类型。 – DavidG

+0

尽管您可能会在代码中的任意位置定义变量,但编译器将实际使用默认值在当前范围的顶部定义它。 – juharr

回答

5

我猜status字段的数据类型是enum。枚举的第一个值是默认值(如果枚举是未编号的,则值为0)。

var只是表示“使用从该方法返回的数据类型(或一般分配)。所以var在这里的意思只是‘枚举类型返回’。

这意味着,如果REC_OK是在第一个值枚举,它是该字段的默认值。枚举的不能有一个空值,因此它显示默认值。

我看到中断点还没有到达那里呢仍然显示那些当前状态在范围内的未初始化的变量。这只是一个Visual Studio的东西。

+0

这并不能解释为什么'var'已经成为'enum'值。 – DavidG

+0

好的,没有看到这是真正的问题。扩展@DavidG –

+0

很混乱(“视觉工作室事情”),但它有帮助。谢谢@帕特里克 – Ahmed

2

status变量是Enumenum是值类型,而不是引用类型。即使代码没有达到设定变量的点,值类型也始终设置默认值。
此外,var不是类型,它只是语法糖,你变量有实际的enum类型。

+0

看看这个答案@Patrick,这似乎是这种情况(+1为此) – Ahmed