4

私はそれが少し一口で、完全に理解できないかもしれないことを知っています. だからここに私がやろうとしていることの例があります。

public class TypeWithString
{
    public string MyString { get; set; }
}

string s = "We Want Moshiach Now";
TypeWithString tws = new TypeWithString();
object o = s;
dynamic d = tws;
d.MyString = o;

このコードは驚くべきことにエラーを生成しますRuntimeBinderException: Cannot implicitly convert type 'object' to 'string'MyStringはタイプでありstring、保持されてoいるのはstring.

これは DLR のバグですか、それとも欠点ですか?

それを回避する方法はありますか?

事前にタイプがわからない場合。しかし、ダックタイピングに準拠していることは知っています。つまり、書かれていないインターフェースを実装していることを知っています。本当に正しい型であるときに、ある変数を別の変数に割り当てることができる方法はありますか?

どうもありがとう

4

2 に答える 2

4

いいえ、これは想定内です。コンパイラはoisの型を知っているobjectので、「呼び出されたプロパティを見つけて、型の値をそれに代入しようとする」という動的アクションを記録しMyStringます。そうではありません。動的なステートメントの唯一の部分がそのターゲットであることに注意してください...動的に処理される唯一のビットです。実行時に、「実行時コンパイラ」は事実上、「の値の実際の型は何ですか?ああ、それは TypeWithString です...今、次の場合はどうなるでしょうか:objectobjectstringd

TypeWithString tmpD = (TypeWithString) d;
tmpD.MyObject = o;

...そして何が起こるかは、コンパイル時エラーです。

値でも動的に動作させたい場合は、代入する値のdynamic代わりに次のように使用します。object

string s = "We Want Moshiach Now";
TypeWithString tws = new TypeWithString();
dynamic o = s;
dynamic d = tws;
d.MyString = o;

今回は、「実行時コンパイラ」がd oの値の実際の型を尋ね、次のようなコードを想像します。

TypeWithString tmpD = (TypeWithString) d;
string tmpO = (string) o; // Actual type is string at execution time
tmpD.MyObject = tmpO;
于 2010-07-01T21:03:19.103 に答える
1

d.MyString = o as string;キャストが存在しない場合は、o を (スローせずに) 文字列または null にキャストするものをいつでも試すことができます。

于 2010-07-01T21:06:34.183 に答える