サンプルコンソールアプリケーションでこれを再作成する際に問題が発生したため、何が起こっているのか非常に興味があります。インターフェイスでToString()を呼び出せないのはなぜですか?
元の問題は、私のコードでは、私はICat
というクラスがあり、このクラスが同じアセンブリで
public interface ICat
{
string ToString(CatColour colour);
}
C#で記述されていることを、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
これは私がこのコードで、C#のアプリでこれを再作成しようとしたArgument not specified for parameter 'colour' of 'Function ToString(format As AddressFormat) As String'.
を言っコンパイラエラーを与えます:
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()メソッドのコメントを解除した場合、最初の行ではなく> I am a cat.
ある)
。
私は上記の元のエラーを取得することを期待し、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
Class 'Cat' must implement 'Function ToString(colour As String) As String' for interface 'IAnimal'
だから何がここで起きているのでしょうか?なぜ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
私はC#のコードでは発生しません元の問題であり、これはArgument not specified for parameter 'colour' of 'Public Function ToString(colour As String) As String'
を取得します。どんな考え? Catはオブジェクトであるため、空白のToString()
メソッドがあります。
から引数なし
ToString()
を上書きします。 _Toなぜ私はToString()を呼び出すことはできませんinterface_は、インタフェースがオブジェクトから継承しないためかもしれません。 –C#のバージョンでは、パラメータを持つToStringメソッドとパラメータを持たないメソッドのバージョンを定義しています。しかし、VBバージョンではパラメータバージョンのみが存在します。私はあなたもそれを無効にする必要があると思います。つまり明示的な実装が必要です。 –
私はあなたが言うことができると思いますが、VB.NETはToString()を呼び出し可能にするために 'ToString()'を追加したいのですが、ToString()が 'Object'のメソッド'猫'はオブジェクトですか? – NibblyPig