【发布时间】:2011-04-10 13:50:48
【问题描述】:
我最近报告了一个关于我的 API 的奇怪问题。基本上出于某种原因,当与 VB 代码一起使用时,VB 编译器在尝试调用 ToString() 方法时不会对 Object 进行隐式强制转换。
以下是一个最小的代码示例,首先是 C#,其次是 VB:
Graph g = new Graph();
g.LoadFromEmbeddedResource("VDS.RDF.Configuration.configuration.ttl");
foreach (Triple t in g.Triples)
{
Console.WriteLine(t.Subject.ToString());
}
上面的编译并运行良好,而下面的则不行:
Dim g As Graph = New Graph()
g.LoadFromEmbeddedResource("VDS.RDF.Configuration.configuration.ttl")
For Each t As Triple In g.Triples
Console.WriteLine(t.Subject.ToString())
Next
第二个 VB 示例给出以下编译器异常:
重载解析失败,因为没有 可访问的“ToString”接受这个 参数数量。
这似乎是由于我试图写入控制台的属性t.Subject 的类型已明确定义了带参数的ToString() 方法。 VB 编译器似乎期望使用其中之一,并且似乎没有隐式转换为 Object 并使用标准的 Object.ToString() 方法,而 C# 编译器则使用。
有什么办法可以解决这个问题吗? VB 编译器选项,还是最好只是确保属性的类型(在本例中为接口)显式定义未参数化的 ToString() 方法以确保与 VB 的兼容性?
编辑
这是 Lucian 要求的其他详细信息
- 图形是一个接口的实现,但这实际上是无关紧要的,因为它是INode 接口,这是
t.Subject返回的类型,这是问题所在。
INode 为ToString()定义了两个重载两者都带参数 - 是的,这是编译时错误
- 不,我不使用按名称隐藏,API 都是用 C# 编写的,所以如果我想的话,我无法生成那种 API
请注意,我已经在界面中添加了显式未参数化的 ToString() 重载,从而解决了 VB 用户的问题。
【问题讨论】:
-
不需要演员表。
.ToString()被定义为对象类的公共方法,该对象类是所有 .net 类的子类。所以它是您创建的每个类的成员。即使您已经覆盖了该方法,您也无法将访问修饰符更改为internal- “无法访问'ToString'”让我想到了这个想法。 -
是的,我知道
ToString()的定义方式和位置,这就是为什么我对VB 编译器以这种方式抱怨感到如此困惑的原因。我虽然报告这个问题的人刚刚做了一些愚蠢的事情,但我自己复制了它,所以这是 VB 编译器的某种问题。 -
@Zebi 而且在这种情况下,所有
ToString()重载都是由接口定义的,因此它们必须是公共的,而且相关接口的所有具体实现都会覆盖默认的ToString()方法除了实现额外的重载之外,还可以适当地实现
标签: c# .net vb.net compiler-construction casting