2017-01-22 38 views
1

我有下面的代碼:通用類,通過結構約束,產生編譯時錯誤「使用未分配的局部變量的」

class GenericStruct<T> where T : struct 
{ 
    public void M() 
    { 
     T temp1; 
     T temp2; 
     string s = temp1.ToString(); 
     Type t = temp1.GetType(); 
     bool b = temp1.Equals(temp2); 
    } 
} 

我有兩個錯誤,當調用方法「未分配的局部變量的使用」:的ToString和等於,但GetType沒問題。在編譯時

struct NotGenericStruct 
{ 
    public void M() 
    { 
     NotGenericStruct temp1; 
     NotGenericStruct temp2; 
     string s = temp1.ToString(); 
     Type t = temp1.GetType(); 
     bool b = temp1.Equals(temp2); 
    } 
} 

正常,沒有錯誤: 汀,說:「打擾」我是事實上,

where T : struct 

存在但是,如果我寫的。 據我所知,該結構數據類型具有默認的構造函數,並且所有成員都已初始化,因此不需要寫入新的顯式。

兩個代碼之間究竟有什麼區別?請給我解釋一下我的不解

感謝

+0

使用默認(T)初始化您的變量 –

+0

@Groo我不知道它是一個重複的id。如果我理解正確的話,問題是「什麼是差異_」而不是「_如何修復」。 – AlexD

+0

我同意這不應該真的被關閉。問題是關於爲什麼編譯器允許在第二個示例中使用未分配的局部變量,而當它是一個顯式結構時,而不是在第一個示例中它是隱式結構時。 – Chris

回答

1

在聲明

class GenericStruct<T> where T : struct 

struct表示T是一個類型數值。

type參數必須是值類型。可以指定除Nullable之外的任何值類型。

因此,T可能是,例如,int。而在這種情況下,聲明

T temp1; 

離開temp1初始化。

0

嘗試:

class GenericStruct<T> where T : struct 
{ 
    public void M() 
    { 
     T temp1 = default(T); 
     T temp2 = default(T); 
     string s = temp1.ToString(); 
     Type t = temp1.GetType(); 
     bool b = temp1.Equals(temp2); 
    } 
} 
1

這兩段代碼之間的行爲不同的原因是,在通用情況下,我們所知道的是T是一個結構。除此之外,我們不能再做出任何假設。我們不知道結構是否有方法,字段,屬性,構造函數或其他。

在第二種情況下,我們知道該結構的類型爲NotGenericStruct,並且我們知道關於此結構的所有信息。特別是我們可以看到,它所擁有的只是一種方法。這意味着我們知道實際上沒有需要在此對象上初始化的狀態。

我不能引用允許這個語言規範的確切部分,但很明顯看到編譯器允許單元化結構,因爲它知道它將完全相同,如果你已經完成了new NotGenericStruct

這是很容易看到的行爲不同,因爲如果添加一個int字段(或任何其他類型)NotGenericStruct那麼它將立即開始抱怨使用未初始化的局部變量(指的NotGenericStruct現在它已經字段) 。

一般來說,雖然這是一個非常特殊的情況,它只適用於沒有字段的結構。任何類別或任何結構域需要初始化,所以一般來說最好也是最簡單的假設所有當地人需要初始化。這當然可能會產生更多可讀代碼。

相關問題