2016-01-28 15 views
9

サンプルコンソールアプリケーションでこれを再作成する際に問題が発生したため、何が起こっているのか非常に興味があります。インターフェイスで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()メソッドがあります。

+0

から引数なしToString()を上書きします。 _Toなぜ私はToString()を呼び出すことはできませんinterface_は、インタフェースがオブジェクトから継承しないためかもしれません。 –

+0

C#のバージョンでは、パラメータを持つToStringメソッドとパラメータを持たないメソッドのバージョンを定義しています。しかし、VBバージョンではパラメータバージョンのみが存在します。私はあなたもそれを無効にする必要があると思います。つまり明示的な実装が必要です。 –

+0

私はあなたが言うことができると思いますが、VB.NETはToString()を呼び出し可能にするために 'ToString()'を追加したいのですが、ToString()が 'Object'のメソッド'猫'はオブジェクトですか? – NibblyPig

答えて

7

あなたが少しより多くの情報を追加する必要があります。

Public Class Cat 
    Implements IAnimal 
    Public OverLoads Function ToString(colour As String) As String Implements IAnimal.ToString 
     Return $"I am a {colour} cat." 
    End Function 
End Class 

Public Interface IAnimal 
    Function ToString(colour As String) As String 
End Interface 

それとも

Public Class Cat 
    Implements IAnimal 
    Public Function MyToString(colour As String) As String Implements IAnimal.ToString 
     Return $"I am a {colour} cat." 
    End Function 
End Class 
+0

ああ!これは、VB.NETの部分が私が期待するように振る舞います。しかし、 'New Cat()。ToString()'を実行しても、ToString()を引数なしで呼び出させることはできません。 – NibblyPig

+0

文字列へのオーバーロードの追加を訂正すると、その機器を完全に呼び出す必要がなくなりました... – Codexer

+0

'Overloads'を追加すると問題が解決したようです。私はこれがVB.NETでなぜ必要なのか知りたいです。 これはC#で書かれているため、このようなキーワードはありません。 – NibblyPig

2

(あなたがObject由来別の基地ToString()を持っているので)あなたが引数でToString()ためOverloadsを宣言することもできます には、Objectから派生したものはありません。

Public Class Cat 
    Implements IAnimal 
    Public Overloads Function ToString(colour As String) As String Implements IAnimal.ToString 
     Return "I am a {colour} cat." 
    End Function 
    Public Overrides Function ToString() 
     Return "I am a cat." 
    End Function 
End Class 

Public Interface IAnimal 
    Function ToString(colour As String) As String 
End Interface 

代わりに、IAnimalための2つのToString()を作成することができ、あなたはIAnimalからではなく、あなたが明示的インターフェイスのメソッドを実装する必要がObject

Public Class Cat 
    Implements IAnimal 
    Public Overloads Function ToString(colour As String) As String Implements IAnimal.ToString 
     Return "I am a {colour} cat." 
    End Function 
    Public Overrides Function ToString() As String Implements IAnimal.ToString 
     Return "I am a cat." 
    End Function 
End Class 

Public Interface IAnimal 
    Function ToString(colour As String) As String 
    Function ToString() As String 
End Interface 
+0

これが必要だと思います。 –

+0

コンパイラがオーバーライドする必要があるという警告が表示されても、それを上書きすることはできません。なぜなら、その場合、そのシグネチャでオーバーライドする関数がないというエラーが表示されるからです。 – NibblyPig

+0

明らかに 'Overloads'キーワードはそれを修正しますが、私はC#アセンブリにインターフェイスを持っているので、VB.NETがうまく演奏できるようにキーワードを追加する方法はありません。 – NibblyPig

関連する問題