代码之家  ›  专栏  ›  技术社区  ›  John M Gant aman_novice

我可以创建一个接受可为null的<something>的泛型函数吗?

  •  1
  • John M Gant aman_novice  · 技术社区  · 15 年前

    我正在研究一个方法,该方法将接受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始终是可为null的<&燃气轮机;键入,并访问可为空的<&燃气轮机;属性(HasValue和Value)?或者我应该坚持使用底层类型特定的重载吗?

    This question

    4 回复  |  直到 7 年前
        1
  •  12
  •   Andrew Hare    15 年前

    试着这样做:

    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);
    }
    
        2
  •  3
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前
    public void FixedWrite<T>(StreamWriter writer, Nullable<T> value, int length)
    

    有什么问题吗?

        3
  •  1
  •   Blue Toque    15 年前

    无需测试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?>(....)
    
        4
  •  0
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

    简单的答案是否定的。

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