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

How do I write [DefaultValue(null)] in VB.NET? <DefaultValue(Nothing)> does not compile

这并不像看起来那么微不足道。这是 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:

时遇到问题

Overload resolution failed because no accessible New is most specific for these arguments:

  • Public Sub New(value As Boolean): Not most specific.
  • Public Sub New(value As Byte): Not most specific.
  • Public Sub New(value As Char): Not most specific.

我很确定这是因为VB.NET中的Nothing不仅表示"the null reference"(C#中的null),而且"the default value for"参数类型(C# 中的default(T))。由于这种歧义,每个构造函数重载都是一个潜在的匹配项。

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

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

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

"[…] won't work because the compiler has problems choosing the correct overload of DefaultValueAttribute's constructor[.]"

可以协助编译器将 Nothing 类型转换为所需的类型:

<DefaultValue(DirectCast(Nothing, Object))>

"<DefaultValue(CObj(Nothing))> also won't work because it is not a constant value."

幸运的是,与 CObj(Nothing) 不同,编译器将 DirectCast(Nothing, Object) 和令人惊讶的 CType(Nothing, Object) 视为常量值,因此它被接受。