2010-10-29 91 views
4

我想工作的代码:VB.NET扩展(Of T)已对象,给出错误类型

<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对象,它会做到这一点,它的工作原理,但我不能让它与一般的科技工作:

<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) 

变量“结果”现在有当前日期时间。

当我和T尝试它,我得到这个是错误(这Visual Studio中提出在T在可空(Of T)已: 型“T”必须是值类型或约束为“结构”类型参数为了与“可空”或为空的修饰符“?”来使用。

非常感谢您的帮助!

问候

回答

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

只需要第一个'As Structure'子句,第二个将导致语法错误。除此之外,这是正确的。 – 2010-10-29 13:31:49

+0

我认为可能是这种情况。我自己还没有必要使用它,但我知道这是可能的。 – 2010-10-29 13:33:40

+0

非常感谢!这个伎俩。 :) – FrieK 2010-10-29 14:09:22

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;)。

+0

我知道这是,但我必须经常使用它,所以扩展会使它更短,更整齐。 – FrieK 2010-10-29 14:10:10

+0

@FrieK:如果你知道它为什么你在扩展方法中用不同的方式写它?除此之外,我不觉得你的方法比使用'If'更方便。现在,如果你使用'[或]'作为方法名,这将允许写'nullval.Or(42)'。现在* *确实很整齐。 – 2010-10-29 14:25:28

+0

哦,我误解了,对不起。你是对的,只是如果(..,..)确实会更短,或者Or确实是一个好主意,那会更容易阅读。 – FrieK 2010-10-31 08:25:34

1

我一直在寻找这个问题的答案,并很高兴与安德鲁·库珀的解决方案,但我不能尽管它可以编译,但它不会在实践中发挥作用。如果我试图调用有问题的Nullable的扩展方法,我不会在可用方法列表中看到我的扩展方法。如果直接调用它,我会收到以下错误:''System.Nullable'不满足类型参数'T'的'结构'约束,只允许不可为空的'结构'类型。我找到了这个错误here的可能解释。

我使用了无参数的GetValueOrDefault()重载,因为它似乎完成了我的初始目标。一些research后,我很舒服,GetValueOrDefault()是足够的,如果不是最好的解决方案。在FrieK的情况下,我会选择使用带有defaultValue作为参数的GetValueOrDefault()的重载。


+0

当你说你无法使用它时,如果你提供了确实的代码,那将是一件好事。我认为你要么不正确地定义或称呼它;我们并不试图将Nullable作为结构。 'T'是'Structure',但参数'value'是'Nullable(Of T)'。所以,我们将Nullable传递给Nullable而不是结构。 “直接调用它”的作品 - 尽管你必须指定“(Of Integer)”直接使用它(而不是扩展方法):Dim nullval As Integer? = Nothing','Dim result = NValue(Of Integer)(nullval,42)'。 – ToolmakerSteve 2014-03-19 05:44:13