这并不像看起来那么微不足道。它是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
的相同构造函数,我真的很感兴趣。
答案 0 :(得分:6)
“[...]无效,因为编译器在选择
DefaultValueAttribute
的构造函数[。]的正确重载时遇到问题”
可以使用Nothing
的类型转换为所需类型辅助编译器:
<DefaultValue(DirectCast(Nothing, Object))>
“
<DefaultValue(CObj(Nothing))>
也不起作用,因为它不是一个常数值。”
幸运的是,与CObj(Nothing)
不同,编译器会考虑DirectCast(Nothing, Object)
- 而且令人惊讶的是CType(Nothing, Object)
- 一个常量值,因此它被接受。