我可以创建一个接受Nullable <something>?</something>的泛型函数

时间:2009-09-01 18:12:57

标签: .net generics nullable

我正在研究一种方法,它接受StreamWriter,字符串或可空值,以及长度,并将值写入StreamWriter,填充到长度。如果值为null,我想写空格。我想做一些类似下面的简化示例,仅用于演示目的。

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&lt;&gt;类型,并访问Nullable&lt;&gt;属性(HasValue和Value)?或者我应该坚持基础类型特定的重载?

This question提出了类似的问题,但在我的情况下,这些值已经是无效的,我只想写出值,如果它有一个,如果没有,则写出空格。

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:3)

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

有什么问题吗?

答案 2 :(得分:1)

无需测试HasValue,因为Nullable是一个结构,你可以施加“new()”约束:

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?>(....)

答案 3 :(得分:0)

简单的答案是否定的。

即使它是一个结构,由于可能出现的递归问题,它在CLR中被特别禁止。

Nullable<Nullable<Nullable<etc.>>>()