如何在 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)
视为常量值,因此它被接受。
这并不像看起来那么微不足道。这是 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)
视为常量值,因此它被接受。