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

sta*_*ica 5 c# vb.net c#-to-vb.net overload-resolution

这并不像看起来那么微不足道.这是这个问题的后续行动.

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

// using System.ComponentModel;

[DefaultValue(null)]
public object DataSource { … }
Run Code Online (Sandbox Code Playgroud)

如果我把它翻译成VB.NET,我会试试这个:

'Imports System.ComponentModel

<DefaultValue(Nothing)>
Public Property DataSource As Object
    …
End Property
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为编译器在选择构造函数的正确重载时DefaultValueAttribute遇到问题:

重载决策失败,因为New这些参数的特定访问权限不是最具体的:

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

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

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

究竟是如何我在VB.NET写的吗?

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

sta*_*ica 6

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

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

<DefaultValue(DirectCast(Nothing, Object))>
Run Code Online (Sandbox Code Playgroud)

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

幸运的是,不同的是CObj(Nothing),编译器认为DirectCast(Nothing, Object)- 并且CType(Nothing, Object)令人惊讶的是- 也是一个常量值,因此它被接受了.

  • @Stack如果你想拥有与C#相同的代码,你必须转换为String :-)请参阅http://goo.gl/iP3N7e` .custom instance void [System] System.ComponentModel.DefaultValueAttribute ::.ctor(字符串)` (2认同)