2009-09-01 50 views
1

我正在接受StreamWriter的方法,它可以是字符串,也可以是空值,也可以是長度,然後將值寫入到StreamWriter中,填充爲長度。如果值爲空,我想寫空格。我想做一些類似以下簡單示例的示例,這僅用於演示目的。我可以創建一個接受空值<something>的通用函數嗎?

public void FixedWrite(StreamWriter writer, string value, 
     int length) { 
    if (value == null) value = ""; 
    value = value.PadRight(length); 
    writer.Write(value); 
} 

public void FixedWrite<T>(StreamWriter writer, T value, 
     int length) where T : Nullable /* won't work of course */ { 
    string strVal; 
    if (!value.HasValue) strVal = null; 
    else strVal = value.Value.ToString(); 
    FixedWrite(writer, strVal, length); 
} 

我可以有各種不同的基礎類型重載(他們所有日期,整型,布爾變量和小數),但我想看看我是否能得到通用版工作。有沒有辦法讓T始終是一個可爲空的類型,並且可以訪問Nullable的屬性(HasValue和Value)?或者我應該堅持使用底層類型特定的重載?

This question構成了一個類似的問題,但在我的情況下,這些值已經是可空的,我只想寫出它的值,如果它有一個空格,如果它沒有。

回答

12

嘗試這樣:

public void FixedWrite<T>(StreamWriter writer, Nullable<T> value, int length) 
    where T : struct 
{ 
    string strVal; 
    if (!value.HasValue) strVal = null; 
    else strVal = value.HasValue.ToString(); 
    FixedWrite(writer, strVal, length); 
} 
+0

當然。我讓它比需要的更難。謝謝。 – 2009-09-01 18:20:13

+0

這可以工作,但是你*仍然可以將一個可爲空的參數傳遞給泛型方法。 – 2009-09-01 18:29:41

0

簡單的答案是否定的。

即使它是一個結構,由於可能出現遞歸問題,它在CLR中被明確禁止。

Nullable<Nullable<Nullable<etc.>>>() 
+0

可以做他想做的事情,即將可空類型作爲通用參數傳遞。也可以測試該類型爲null,因爲Nullable不再是值類型,只需測試== null – 2009-09-01 18:27:16

+0

+1即可獲取有用的信息。正如Oplapanax指出的那樣,可以將一個可爲空的參數作爲一個泛型參數傳遞,但是Jaimal的正確性是,您無法定義一種通用方法來專門限制爲可空的,這正是我之前的做法。不知道爲什麼這是downvoted,因爲這是一個有益的和技術上正確的答案,我的問題。 – 2009-09-01 20:12:07

+0

'Nullable >'概念上沒有錯。像'Dictionary >'可能想要提供'TryGetvalue'方法,其返回值包含結果以及成功指示。如果不是針對'Nullable '的限制和古怪的行爲,這種方法的邏輯類型將是'Nullable >'。如果返回的Hasvalue爲true,那麼Value就會使用指定的鍵保存存儲在集合中的項目(如果Value.HasValue爲false,那就意味着集合中存儲了這個項目)。 – supercat 2012-12-23 17:43:26

3
public void FixedWrite<T>(StreamWriter writer, Nullable<T> value, int length) 

什麼不對?

+3

爲了進行編譯,您必須將'T'限制爲值類型,請參閱我的答案。 – 2009-09-01 18:20:08

+0

謝謝。我懶得發火,找出編譯器實際上說的是什麼:)。 – 2009-09-01 18:48:14

1

無需測試的HasValue,因爲可空是一個結構,可以並處「新()」的約束:「?」

public void FixedWrite<T>(StreamWriter writer, T value, int length) where T : new() 
{ 
    // just test for NULL 
    string strVal = (value==null) ? string.Empty: value.ToString(); 
    FixedWrite(writer, strVal, length); 
} 

現在你罵它像這樣(用符號是鍵):

FixedValue<System.DateTime?>(....) 
+0

但是我將無法訪問HasValue和Value方法的值,因爲編譯器不會知道它是可以爲空的,對嗎? – 2009-09-01 18:45:43

+0

正確;測試NULL意味着它沒有價值。如果它不爲空,它就有一個值。 – 2009-09-01 18:54:57

+0

抱歉,編輯刪除該語句的代碼,希望更清楚。 – 2009-09-01 18:56:47

相關問題