質問

Scala では次のように定義できます。 構造タイプ 次のように:

type Pressable = { def press(): Unit }

これは、次のように、Pressable なものを引数として取る関数またはメソッドを定義できることを意味します。

def foo(i: Pressable) { // etc.

この関数に渡すオブジェクトには、型で定義された型シグネチャと一致する press() というメソッドが定義されている必要があります。引数は取らず、Unit (Scala のバージョンの void) を返します。

構造型をインラインで使用することもできます。

def foo(i: { def press(): Unit }) { // etc.

これにより、プログラマは基本的にダック タイピングのすべての利点を享受しながら、コンパイル時の型チェックの利点を得ることができます。

C#にも同様のものはありますか?Google で調べても何も見つかりませんでしたが、C# については詳しくありません。存在しない場合、これを追加する予定はありますか?

役に立ちましたか?

解決

いいえ、私が知っている計画はありません。(構造ではなく) 名前付きのみのサブタイプ (例:インターフェース)。

(他の人も見たいかもしれません

http://en.wikipedia.org/wiki/Nominative_type_system

http://en.wikipedia.org/wiki/Structural_type_system

)

(数人は、次のような特殊なケースを指摘するかもしれません。 foreach 構造型付けを使用したステートメント GetEnumerator, 、しかしこれは 例外 ルールというよりも。)

他のヒント

目指すは世界中に存在する方法を定義する構造型は、特定の機能です。あるライブラリを追加する鴨タイピング支援にC#できる見 こちらの.

この例からダックタイピングプロジェクト.にご注意ください、 鴨入力させることができることを実行できな.ることは、私にも理解するこのライブラリを生成プロキシのタイプダックを入力するとは思えないほど上品なコンパイル時のサポートが楽しめScala.これはこの世代のC#.

public interface ICanAdd
{
    int Add(int x, int y);
}

// Note that MyAdder does NOT implement ICanAdd, 
// but it does define an Add method like the one in ICanAdd:
public class MyAdder
{
    public int Add(int x, int y)
    {
        return x + y;
    }
}

public class Program
{
    void Main()
    {
        MyAdder myAdder = new MyAdder();

        // Even though ICanAdd is not implemented by MyAdder, 
        // we can duck cast it because it implements all the members:
        ICanAdd adder = DuckTyping.Cast<ICanAdd>(myAdder);

        // Now we can call adder as you would any ICanAdd object.
        // Transparently, this call is being forwarded to myAdder.
        int sum = adder.Add(2, 2);
    }
}

これはC#の達成を使用して同じようにすると、いうわけでボーリンインタフェース

interface IPressable {
  void Press();
}

class Foo {
 void Bar(IPressable pressable) {
    pressable.Press();
 }
}

class Thingy : IPressable, IPushable, etc {
 public void Press() {
 }
}

static class Program {
 public static void Main() {
  pressable = new Thingy();
  new Foo().Bar(pressable);
 }
}

その他の人は、こんな 本当に をご用意。純(ここではよりも、実行による言語。しかし、.NET4.0対応し同様のものを輸入COMインタフェースとして使われることが実施のための構造タイピングします。います。このブログ記事:

かみっこいいと思うかをコンパイラの文書の言語構造タイピングします。います。(アイデアはい(またはコンパイラ)のみ定義されるインターフェースの背後のシーンでの作業でのインタフェース処理をしない相当のおかげCOM同値ます。

また、C#4.0支 dynamic キーワードになるかと思いきとして解釈される構造タイピング(静的な型チェック).キーワードできる電話方法のanyオブジェクトになknowning(コンパイル時にか否かのオブジェクトは必要。これは基本的に同じものとしての"ダックタイピング"プロジェクトによるイゴール-(そのことはもちろん、不適切な構造タイピング).

C#でawaitableパターンは、おそらく構造的サブタイプ/実存タイプの限定、アドホックインスタンスとして解釈することができます。コンパイラは、メソッドとプロパティの特定のセットで任意awaitオブジェクトを返すGetAwaiter()メソッドへのアクセスを有するのみINotifyCompletionオブジェクトになります。 「awaitable」オブジェクトも「awaiter」オブジェクトのいずれも(後者の場合INotifyCompletion除く)任意のインターフェイスを実装する必要があるため、awaitは、構造的に型指定されたawaitableオブジェクトを受け付ける方法と同様である。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top