【问题标题】:How do I write [DefaultValue(null)] in VB.NET? <DefaultValue(Nothing)> does not compile如何在 VB.NET 中编写 [DefaultValue(null)]? <DefaultValue(Nothing)> 不编译
【发布时间】:2015-04-20 13:04:26
【问题描述】:

这并不像看起来那么简单。这是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 不仅意味着“空引用”(C# 中的null),而且还意味着参数类型的“默认值”(C# 中的default(T) )。由于这种模糊性,每个构造函数重载都是潜在的匹配项。

&lt;DefaultValue(CObj(Nothing))&gt; 也不起作用,因为它不是一个常数值。

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

P.S.: &lt;DefaultValue(GetType(Object), Nothing)&gt; 是一个选项,但它可以规避问题。如果有任何方法可以为DefaultValueAttribute 使用与 C# 版本相同的构造函数,我真的很感兴趣。

【问题讨论】:

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


    【解决方案1】:

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

    可以通过将Nothing 类型转换为所需类型来帮助编译器:

    <DefaultValue(DirectCast(Nothing, Object))>
    

    &lt;DefaultValue(CObj(Nothing))&gt; 也不起作用,因为它不是一个常数值。”

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

    【讨论】:

    • @Stack 如果你想拥有与 C# 相同的代码,你必须转换为 String :-) 见 goo.gl/iP3N7e .custom instance void [System]System.ComponentModel.DefaultValueAttribute::.ctor(string)
    • 转换为字符串还有一个好处是 ReSharper 不会混淆。使用DirectCast(Nothing, Object),即使编译器没有,它也认为它是模棱两可的。
    • 令人惊讶的是,如此简单的事情如何变得越来越奇怪。 :-D
    • 'CType(Nothing, Object)' 也有效 - 这真的很奇怪,因为 'CObj(Nothing)' 只是 CType 版本的简写语法。
    猜你喜欢
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多