我在创建一个样例控制台应用程序时遇到了不同的问题,因此我非常想知道发生了什么。
最初的问题是,在我的代码中,我有一个名为ICat
的类,这个类是用C#编写的。
public interface ICat
{
string ToString(CatColour colour);
}
在相同的程序集中,使用C#实现如下:
public class MagicCat : ICat
{
public string ToString(CatColour colour)
{
return $"I am a {colour} cat";
}
}
这段代码可以无误编译。
在另一个使用VB.NET编写的程序集中,我有以下代码:
Dim myCat As ICat = GetCat()
Dim result = myCat.ToString() ' Error on this line
这会导致编译器错误,提示“未为'Function ToString(format As AddressFormat) As String'的参数'colour'指定参数。”
我尝试在C#应用程序中重新创建此代码:
public class Cat : IAnimal
{
public string ToString(CatColour colour)
{
return $"I am a {colour} cat.";
}
//public string ToString()
//{
// return "I am a cat.";
//}
}
public interface IAnimal
{
string ToString(CatColour colour);
}
class Program
{
static void Main(string[] args)
{
IAnimal cat = new Cat();
Console.WriteLine(new Cat().ToString());
Console.WriteLine(new Cat().ToString(CatColour.Red));
Console.WriteLine(cat.ToString());
Console.WriteLine(cat.ToString(CatColour.Blue));
Console.ReadKey();
}
}
public enum CatColour
{
Red = 1,
Blue = 2
}
它编译并运行,输出结果为:
ConsoleApplication1.Cat
我是一只红猫。
ConsoleApplication1.Cat
我是一只蓝猫。
(如果我取消注释另一个ToString()方法,则第一行将变为> 我是一只猫。
)
这正是我所期望的。
我将应用程序转换为VB.NET,期望得到上述原始错误,但实际上我遇到了这个问题:
Public Class Cat
Implements IAnimal
Public Function ToString(colour As String) As String
Return "I am a {colour} cat."
End Function
End Class
Public Interface IAnimal
Function ToString(colour As String) As String
End Interface
类 'Cat' 必须为接口 'IAnimal' 实现 'Function ToString(colour As String) As String'
这里发生了什么?为什么VB.NET在我的接口实现中给我一个错误,为什么我的原始场景抱怨没有不带参数的ToString()方法?
编辑:我已经更新了我的VB代码:
Public Interface IAnimal
Function ToString(colour As String) As String
End Interface
Public Class Cat
Implements IAnimal
Public Function ToString(colour As String) As String Implements IAnimal.ToString
Return "I am a {colour} cat."
End Function
End Class
Sub Main()
Dim cat As Cat = New Cat()
Dim icat As IAnimal = New Cat()
Call cat.ToString()
End Sub
我遇到了一个问题:Public Function ToString(colour As String) As String
的参数'colour'未指定,这是原始问题,在C#代码中没有出现。有什么想法吗?Cat是一个对象,因此它上面有一个空的ToString()
方法。
ToString()
方法时需要将其添加到接口中才能被调用,而C#却不需要,因为ToString()
是Object
的一个方法,而Cat
是一个对象? - NibblyPig$
,这样颜色才能真正替换字符串(很高兴看到有人知道如何正确拼写"colour") - Matt WilkoToString
,即使有不同的签名,因为它可能会与所有对象都继承自Object
的ToString()
函数混淆。;-) - shadowIAnimal
的ToString
方法,例如string IAnimal.ToString(CatColour colour)
,那么您将在C#中看到与VB中相同的问题。 - TnTinMn