none
ラムダ式の共変性、反変性 RRS feed

  • 質問

  •       Expression<Func<String>> e1=() => "ABC";
          var 答え1=e1.Compile()();
          Expression<Func<Object>> e2=e1 as Expression<Func<Object>>;
          var 答え2=e2.Compile()();
    
    

    上記のコードでやりたいことは色々な型を返すExpression<Func<T>>をExpression<Func<Object>>に入れ、それからCompileして値を取得したいのです。

    そもそもExpression<Func<Object>>にキャストできません。
    これはコレクションクラスにたくさんのExpression<Func<T>>を代入してから使いたいからです。
    これを実現することは可能でしょうか?

    2010年7月30日 3:43

回答

  • 最初から

    Expression<Func<object>> e1 = () => "ABC";

    と宣言しておけばいいのでは?

    • 回答としてマーク 和和和 2010年7月30日 4:30
    2010年7月30日 4:15
  • やってみました。

    こんなシンプルに解決できるとは思いませんでした。これで目的は達成できます。ありがとうございました。

    とりあえず別の解では

          Expression<Func<String>> e1=() => "ABC";
          Object Object型になったラムダ式=e1;
          var ExpressionのGenericType=Object型になったラムダ式.GetType();
          var Compile=ExpressionのGenericType.GetMethod("Compile",Type.EmptyTypes);
          //Expression<Object> e2=e1 as Expression;
          var 実行Delegate=Compile.Invoke(Object型になったラムダ式,new Object[0]) as Delegate;
          var 答え=実行Delegate.DynamicInvoke(null);
    
    でも出来ました。

     

    • 回答としてマーク 和和和 2010年7月30日 4:29
    2010年7月30日 4:29

すべての返信

  • 最初から

    Expression<Func<object>> e1 = () => "ABC";

    と宣言しておけばいいのでは?

    • 回答としてマーク 和和和 2010年7月30日 4:30
    2010年7月30日 4:15
  • やってみました。

    こんなシンプルに解決できるとは思いませんでした。これで目的は達成できます。ありがとうございました。

    とりあえず別の解では

          Expression<Func<String>> e1=() => "ABC";
          Object Object型になったラムダ式=e1;
          var ExpressionのGenericType=Object型になったラムダ式.GetType();
          var Compile=ExpressionのGenericType.GetMethod("Compile",Type.EmptyTypes);
          //Expression<Object> e2=e1 as Expression;
          var 実行Delegate=Compile.Invoke(Object型になったラムダ式,new Object[0]) as Delegate;
          var 答え=実行Delegate.DynamicInvoke(null);
    
    でも出来ました。

     

    • 回答としてマーク 和和和 2010年7月30日 4:29
    2010年7月30日 4:29
  • unsafeとか今回の共変性とかいろいろ難しいことに挑戦されているようですが、もっともっと基本的なところの理解が足りていない部分が時折見受けられます。
    それだけならいいのかもしれませんが、質問に現れていない部分でオオポカをやらかしていないかちょっと気になります。

    いらぬお世話かもしれませんが、もっと基本を身に着けてから挑戦した方がいいと思います。

    2010年7月31日 1:56
  • 何が基本かよく分かっていないのでそのつど必要とされる技術を調べるという方針でやっています。

     

    2010年7月31日 2:01
  • 横からすいません。

    > 何が基本かよく分かっていないのでそのつど必要とされる技術を調べるという方針でやっています。

    なるほど、そういう方も多いかも知れません。
    .NET で開発する場合、開発のベースとすべき書籍にこういうのがあります。

    .NETのクラスライブラリ設計

    レビュアーのひにものさんのおっしゃる通り、全ての.Net開発者が読むべき本だと思います。
    ただし翻訳に難があり間違いもかなり多いですが、第二刷以降はエラッタがかなり修正されているという話です。

    MSDN だと、クラス ライブラリ開発のデザイン ガイドライン。上記の書籍は、このガイドラインをより詳細に解説したものです。

    あと私はまだ読んでないのですが、.NET Framework 全体の基礎を知るにはこちらだという話です。

    プログラミングMicrosoft .NET Framework 第2版

     

     


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年7月31日 15:34
    モデレータ