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#版本相同的构造函数,我真的很感兴趣.
"[...]将无效,因为编译器在选择
DefaultValueAttribute构造函数[.] 的正确重载时遇到问题"
可以使用Nothing所需类型的类型转换来辅助编译器:
<DefaultValue(DirectCast(Nothing, Object))>
Run Code Online (Sandbox Code Playgroud)
"
<DefaultValue(CObj(Nothing))>也不会起作用,因为它不是一个恒定的价值."
幸运的是,不同的是CObj(Nothing),编译器认为DirectCast(Nothing, Object)- 并且CType(Nothing, Object)令人惊讶的是- 也是一个常量值,因此它被接受了.