2013-02-26 15 views
5

私はちょうどGuidがオブジェクトではないことを示すように見える次の例外があります。なぜGuidはC#のオブジェクトではありませんか?

タイプの発現は、 '可能System.Guid' 戻り値の型 のために使用することはできませんGuidないオブジェクトでどのように 'のSystem.Object'

コンパイラはこれをどのように把握していますか?タイプがオブジェクトでないときに実行時に検出できるようなものがなければなりません。

==================追加情報で編集==================

​​

SomeExpressionは、問題のすべてについて、Guidの定数値になります。

+2

これは関連しているようです:http://stackoverflow.com/questions/2200209/expression-of-type-system-int32-cannot-be-used-for-return-type-system-object –

+0

はい、ですが、私は必ずしもキャストしたくない、バットから何かがうまくいくかどうかわかるだろうか?式は、ネイティブ/値型のものを処理するまでは正常です。 – Alwyn

+3

あなたの質問にサンプルコードがありません。MSDNへのリンクを含むCSXXXXエラーコードが表示されるので、明確ではない点についてコメントすることができます。 –

答えて

17
​​

ここでの問題は、式のツリーを誤って使用していることです。ボックス操作はC#で暗黙的ですが、依然として存在します。それはではなく、です。以下は、それを修正する必要があります:あなたはまた、この追加の明示的な変換を追加するかどうかを決定するためにSomeExpression.Type.IsValueTypeをチェックすることができ

Expression.Lambda<Func<object>>(
    Expression.Convert(SomeExpression, typeof(object)) 

+0

マーク、私はGuidを扱うまで、暗黙の変換はうまくいきました。それは私の辞書、リスト、カスタム複合クラスでうまく動作します - 名前を付けます。私はGuidだけが例外だとは思わないが、間違いなくそれらの一つだ。 – Alwyn

+5

@Alwynと言及されているものはすべて*参照型*です。私が言ったように:ボックス操作は明示的でなければならない。 'Guid'は* value型*(' struct') –

+0

@MarcGravell Gotcha、それは多くのことを説明していますので、値型のボクシングが必要です。すべての参照型がフリーパスを取得します。 – Alwyn

関連する問題