2016-06-16 8 views
1

VB.netコードをC#に変換していますが、問題が発生しています。 VB.netでは、OBJECTパラメータを使用する関数があります。これらのパラメータは、通常、私が必要とする同じメソッドを持つ2つの異なる型です。例:キャストのないC#暗黙の変換

Public Sub test(param1 as Object) 
    param1.show() 
End Sub 

のC#で、私は、関数の同じ種類を行うが、コンパイラはそれを受け入れることはありません。

public void test(object param1) 
{ 
    param1.show(); // Error on .show (not found) 
} 

私はおそらく何らかの方法でパラメータをキャストする必要がありますが、私は関数に異なる種類を送信する必要があります。出来ますか?

+3

はタイプのための共通のインターフェイスまたは基本クラスを定義し、あなたのパラメータの型としてそれを使用。または、これは非常に基本的な問題であるため、それぞれの型に対して 'test()'オーバーロードを作成するだけです。 –

+2

これはVB.NETで動作します。これは、C#で許可されていないレイトバインディング( 'Option Strict Off'を使用)のためです。これは、VB.NETでも可能なことですが、すべきではないことの例です。 'Option Strict'と 'Option Explicit'を有効にすると、VB.NETコードはコンパイルされません...イゴールの回答のインターフェイスソリューションは、両方の言語で動作します。 – CoolBots

答えて

3

あなたはOption Strict OffセットObjectを使用している場合は、私は本当に、本当に、あなたがそれをしないお勧めします、

public void test(dynamic param1) 
{ 
    param1.show(); 
} 

しかしC#でdynamicを使用するのと同じです。 dynamicは、遅いバウンドコード(VB6でこの機能が導入されたObjectも提供されています)を書くのを助けるために発明されたものですから、あなたのコードの強力な型情報を得るためには、

+0

'Object'はVB6とVB.NETで、両方とも遅延バインディング(' Option Strict'がオフになっている)と同じです。 – CoolBots

+0

@CoolBotsありがとうございました。 –

+0

地球温暖化に悪い場合でも、ダイナミックを使用します。その理由は、vb.netのコードがうまくいき、C#でもうまく動作するはずです。不思議なことに、私は遅い結合が多型の一種の進化であると考えました。 JavaScriptのように、JSONオブジェクトを使用すると、型を強制する必要はありません(とにかく型を強制することで、JSONは目的を持たないでしょう)。 – Math

8

これはインターフェイスが存在する理由です。

渡される型は、問題を解決するIShowableコントラクトを実装する必要があります。

0

それとも、タイプごとに別々の機能を加えることができます。

public void test(type1 param1) { param1.show(); } 
public void test(type2 param1) { param1.show(); } 
public void test(dynamic param1) { param1.show(); } // for the rest of the types