Nullable(Of T)对象上的VB.NET扩展,给出了类型错误

时间:2010-10-29 13:19:45

标签: vb.net nullable generics

我想要的代码:

<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

基本上我想要它做的是将默认值赋予可空对象,并且根据它是否为null,它将给出自己的值或默认值。

所以使用Date对象,它会这样做,这有效,但我无法使用它来使用泛型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'现在具有当前的DateTime。

当我用T尝试它时,我得到这个错误(Visual Studio在Nullable(Of T)中放置T: 类型'T'必须是值类型或约束为'结构'的类型参数,以便与'Nullable'或可为空的修饰符'?'一起使用。

非常感谢您的帮助!

问候

3 个答案:

答案 0 :(得分:8)

尝试:

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

答案 1 :(得分:3)

您的功能有点多余,因为If

可以实现同样的功能
Dim nullval As Integer? = Nothing
Dim value  = If(nullval, 42)

这与你所写的相同,即:

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

它等同于C#的空强制运算符??var value = nullval ?? 42;)。

答案 2 :(得分:1)

我一直在寻找这个问题的答案,并对Andrew Cooper的解决方案很满意,但我无法让它在实践中发挥作用,尽管它会编译。如果我试图在有问题的Nullable上调用扩展方法,我就不会在可用方法列表中看到我的扩展方法。如果我直接调用它,我会收到以下错误“'System.Nullable'不满足类型参数'T'的'结构'约束。只允许不可为空的'结构'类型。”我找到了此错误here的可能解释。

我使用GetValueOrDefault()的重载没有参数,因为它似乎完成了我的初始目标。在一些research之后,我觉得GetValueOrDefault()是一个适当的,如果不是更好的解决方案。在FrieK的情况下,我会选择使用带有defaultValue的GetValueOrDefault()重载作为参数。