2015-11-30 94 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