2011-10-02 93 views
1

我想使用泛型返回一個類的對象。泛型和返回類對象

這是通用類

public class ClientBase <S> 
{ 
    protected S CreateObject() 
    { 
     return default(S) ; 
    } 
} 

這是我想使用它...

public class ClientUser : ClientBase <SomeClass> 
{ 

    public void call() 
    { 
     var client = this.CreateObject(); 
     client.SomeClassMethod(); 
    } 
} 

當我運行它的代碼時,你得到的客戶對象,該SomeClassMethod()在行上給出錯誤:

client.SomeClassMethod();

錯誤是'對象引用未設置爲對象的實例'。我知道在通用類ClientBase的CreateObject()方法中缺少一些東西;只是無法確定這一點。請問有人可以幫我嗎?

感謝您的時間...

回答

3

default(S)其中S是引用類型爲null。在你的情況下,default(SomeClass)返回null。當你試圖在空引用上調用一個方法時,那是你得到異常的時候。

您是否試圖返回SomeClass的默認實例?您可能需要使用您的泛型類new()約束和return new S()代替,就像這樣:

public class ClientBase<S> where S : new() 
{ 
    protected S CreateObject() 
    { 
     return new S(); 
    } 
} 

如果S需要是引用類型,你還可以將其約束到class

public class ClientBase<S> where S : class, new() 
{ 
    protected S CreateObject() 
    { 
     return new S(); 
    } 
} 
+0

編輯我的問題......錯過了實際的錯誤。 :) – user20358

+0

@ user20358:我用一些代碼更新了我的答案。 – BoltClock

+0

是試圖返回實例。我嘗試了你所放的。現在我得到這個...異常已經被調用的目標拋出。 – user20358

2

default(T)做什麼:http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx

在你的情況下,default(S)將返回null(因爲它是一個類) - 這不是一個實例這是班級的一部分。

您需要在派生類中調用new S()或其他S構造函數或覆蓋CreateObject