代码之家  ›  专栏  ›  技术社区  ›  Rik De Peuter

对可为空(属于T)对象的VB.NET扩展,给出类型错误

  •  4
  • Rik De Peuter  · 技术社区  · 15 年前

    我想使用的代码:

    <Extension()>
    Public Function NValue(Of T)(ByVal value As Nullable(Of T), ByVal DefaultValue As T) As T
        Return If(value.HasValue, value.Value, DefaultValue)
    End Function
    

    所以基本上我想要它做的是,给一个可以为空的对象一个默认值,根据它是否为空,它会给出自己的值或者默认值。

    所以对于一个日期对象,它可以做到这一点,这是可行的,但我不能让它与通用的T一起工作:

    <Extension()>
    Public Function NValue(ByVal value As Date?, ByVal DefaultValue As Date) As Date
      Return If(value.HasValue, value.Value, DefaultValue)
    End Function
    
    Dim test As Date? = Nothing
    Dim result = test.NValue(DateTime.Now)
    

    变量'result'现在具有当前的日期时间。

    当我用t尝试它时,我得到的结果是错误的(Visual Studio将它放在t的nullable(of t)中): 类型“t”必须是约束到“structure”的值类型或类型参数,才能与“nullable”或可为null的修饰符“?”一起使用。。

    非常感谢您的帮助!

    问候语

    3 回复  |  直到 14 年前
        1
  •  8
  •   Andrew Cooper    15 年前

    尝试:

    Public Function NValue(Of T as Structure)(ByVal value As Nullable(Of T as Structure), ByVal DefaultValue As T) As T
    

    我不确定你是否需要两者 as Structure 条款与否。

    更新

    根据下面的注释,只需要第一个子句:

    Public Function NValue(Of T as Structure)(ByVal value As Nullable(Of T), ByVal DefaultValue As T) As T
    
        2
  •  3
  •   Konrad Rudolph    15 年前

    您的功能有点多余,因为可以通过 If :

    Dim nullval As Integer? = Nothing
    Dim value  = If(nullval, 42)
    

    这和你写的一样,即:

    Dim value = If(nullval.HasValue, nullval.Value, 42)
    

    它相当于C__ s空强制运算符 ?? ( var value = nullval ?? 42; )

        3
  •  1
  •   Jason Jenkins    14 年前

    我在寻找这个问题的答案,并对安德鲁·库珀的解决方案感到满意,但我无法让它在实践中发挥作用,尽管它可以编译。如果我试图对所讨论的可以为空的对象调用扩展方法,我将不会在可用方法列表中看到我的扩展方法。如果我直接调用它,我将收到以下错误:“System.Nullable”不满足类型参数“T”的“Structure”约束。只允许不可为空的“structure”类型。“我找到了此错误的可能解释。” here .

    我在没有参数的情况下使用了getValueorDefault()的重载,因为它似乎完成了我的初始目标。一些之后 research ,我很高兴getValueorDefault()是一个足够的解决方案,如果不是更好的解决方案。在friek的情况下,我将选择使用getValueorDefault()的重载,并将defaultValue作为参数。