6

下位のインターフェイスまたは基本クラスをより派生したクラスにキャストするという意味での動的キャストを意味するのではなく、作成したインターフェイス定義を取得し、そのインターフェイスに、それから派生していない別のオブジェクトを動的にキャストすることを意味しますインターフェイスですが、すべての呼び出しをサポートしています。

例えば、

interface IMyInterface
{
   bool Visible
   {
      get;
   }
}

TextBox myTextBox = new TextBox();
IMyInterface i = (dynamic<IMyInterface>)myTextBox;

これは、既知の型のコンパイル時、および動的に宣言されたインスタンスの実行時に実現できます。インターフェースの定義は型 (この例では) と同様に既知であるため、コンパイラは、オブジェクトがインターフェースによって定義された呼び出しをサポートしているかどうかを判断し、キャストを行うための魔法を実行できます。

私の推測では、これは C#4 ではサポートされていません (参照を見つけることができませんでした) が、確実に知りたいです。そうでない場合は、言語の将来のバリアントに含めるかどうか、およびその理由と反対の理由について話し合いたいと思います。私には、既存のフレームワークの型をラップするためにまったく新しい型を作成する必要なく、コードでより多くのポリモーフィズムを可能にすることは素晴らしい追加のように思えます。

更新
誰かが盗作で私を非難しないように、私はJon Skeetがすでにこれを提案していることに気づいていませんでした. ただし、非常によく似た構文を考えたことを知ってうれしいです。これは、少なくとも直感的である可能性があることを示唆しています。一方、「独創的なアイデアを持つ」ことは、別の日の私のバケット リストに残っています。

4

4 に答える 4

3

Jon Skeet がそのような提案をしたと思います ( http://msmvps.com/blogs/jon_skeet/archive/2008/10/30/c-4-0-dynamic-lt-t-gt.aspx ) が、これまでのところ、C# 4.0 に搭載されるとは聞いていません。

于 2009-04-30T18:34:09.490 に答える
3

それは問題だと思います。結合されていない 2 つのクラス間の結合を導入しています。

次のコードを検討してください。

public interface IFoo
{
   int MethodA();
   int MethodB();
}

public class Bar
{
   int MethodA();
   int MethodB();
}

public class SomeClass
{
   int MethodFoo(IFoo someFoo);
}

これは合法であるべきですか?

int blah = someClass.MethodFoo((dynamic<IFoo>)bar);

コンパイラは IFoo を実装するものとして bar を動的に型付けできるはずなので、合法であるように思われます。

ただし、この時点では、コードの完全に別の部分で呼び出しを介して IFoo と Bar を結合しています。

MethodB が不要になったために Bar を編集すると、Bar と IFoo が関連していなくても、突然 someClass.MethodFood が機能しなくなります。

同様に、MethodC() を IFoo に追加すると、表向きは IFoo と Bar が関連していなくても、コードが再び壊れます。

実際には、これは、制御していないオブジェクト間に類似性がある特定のケースでは役立ちますが、オブジェクトにインターフェイスを明示的にアタッチする必要がある理由があり、その理由は、コンパイラーがそれを保証できるようにするためです。オブジェクトはそれを実装します。

于 2009-04-30T18:46:40.397 に答える
1

オープンソース フレームワークのImpromptu-Interfaceは、C# 4 と dlr を使用してこれを行います。

using ImpromptuInterface;

interface IMyInterface
{
   bool Visible
   {
      get;
   }
}

TextBox myTextBox = new TextBox();
IMyInterface i = myTextBox.ActLike<IMyInterface>();

dlr を使用するため、ExpandoObject および DynamicObject でも機能します。

于 2011-02-28T18:25:23.350 に答える
1

ライブラリとして非常にきれいに実装できるため、C# でこれをサポートする必要はありません。

私は 3 つまたは 4 つの個別の実装を見てきました (それらを見つける前に自分で書き始めました)。これが私が見た中で最も徹底的な治療法です:

http://bartdesmet.net/blogs/bart/archive/2008/11/10/introducing-the-c-ducktaper-bridging-the-dynamic-world-with-the-static-world.aspx

DLR がランタイムに統合されると、実装がさらに簡単になるでしょう。

特定のインターフェイスのラッパー/フォワーダー クラスを 1 回生成してからキャッシュすることができ、その後、未知の型の特定のオブジェクトを 1 回ラップすることができるため、呼び出しサイトなどのキャッシュには多くのスコープがあるため、パフォーマンスは次のようになります。優れた。

対照的にdynamic、言語機能であり、非常に複雑なキーワードは、以前は非常に明確な静的型付け哲学を持っていた言語に足を踏み入れた不必要で、潜在的に悲惨な余談だと思います。今後の改善のために。彼らはそれに固執し、タイピングがより見えなくなるまで、型推論の機能をますます改善する必要がありました。既存のプログラムを壊さずに言語を進化させることができる分野はたくさんありますが、単純にリソースの制約のためにそうしていません (たとえば、varより多くの場所で使用できない理由は、コンパイラを書き直さなければならないためです)彼らには時間がありません)。

彼らは C# 4.0 でまだ良いことを行っています (バリアンス機能) が、型システムをより賢く、より自動化し、コンパイル時に問題を検出する際により強力にするためにできることは他にもたくさんあります。代わりに、本質的にギミックを取得しています。

于 2009-05-09T21:07:12.343 に答える