如何在VB.NET中编写[DefaultValue(null)]? <defaultvalue(nothing)>不编译</defaultvalue(nothing)>

时间:2015-04-20 13:04:27

标签: c# vb.net overload-resolution c#-to-vb.net

这并不像看起来那么微不足道。它是this question的后续行动。

假设我有一个带有属性的Windows窗体用户控件:

// using System.ComponentModel;

[DefaultValue(null)]
public object DataSource { … }

如果我将其翻译成VB.NET,我会尝试这个:

'Imports System.ComponentModel

<DefaultValue(Nothing)>
Public Property DataSource As Object
    …
End Property

这不会起作用,因为编译器在选择正确的overload of DefaultValueAttribute's constructor

时遇到问题
  

重载解析失败,因为这些参数没有特定的可访问New

     
      
  • Public Sub New(value As Boolean):不是最具体的。
  •   
  • Public Sub New(value As Byte):不是最具体的。
  •   
  • Public Sub New(value As Char):不是最具体的。
  •   

我很确定这是因为VB.NET中的Nothing不仅意味着&#34;空引用&#34; (C#中的null),而且&#34;&#34;的默认值参数类型(C#中的default(T))。由于这种歧义,每个构造函数重载都是潜在的匹配。

<DefaultValue(CObj(Nothing))>也不会起作用,因为它不是一个恒定值。

我是如何我在VB.NET中写这个?

P.S。: <DefaultValue(GetType(Object), Nothing)>是一个选项,但它可以解决问题。如果有任何方法可以像{C#版本那样使用DefaultValueAttribute的相同构造函数,我真的很感兴趣。

1 个答案:

答案 0 :(得分:6)

  

“[...]无效,因为编译器在选择DefaultValueAttribute的构造函数[。]的正确重载时遇到问题”

可以使用Nothing的类型转换为所需类型辅助编译器:

<DefaultValue(DirectCast(Nothing, Object))>
  

<DefaultValue(CObj(Nothing))>也不起作用,因为它不是一个常数值。”

幸运的是,与CObj(Nothing)不同,编译器会考虑DirectCast(Nothing, Object) - 而且令人惊讶的是CType(Nothing, Object) - 一个常量值,因此它被接受。