2012-05-05 3 views
1

この例では、「型または名前空間名 『がMyType』が見つかりませんでした(あなたがusingディレクティブまたはアセンブリ参照が不足している?)」を与えるC#で別名ディレクティブを使用して再帰的に宣言することはできますか?

using MyType = System.Func<System.Int32, System.Tuple<System.Int32, MyType>>; 

再帰型を宣言することで、すべてのことが可能ですこのような?

+2

私は通常これを尋ねませんが、なぜですか? –

+0

私はちょうどC#のアクターモデルの最小限のエンコーディングを宣言しようとしていますので、アクターの振る舞いを変えるモデルを作成するために再帰的な関数エイリアスを使用します。 –

+1

私は数分以上それについて考えていませんでしたが、疑いの余地はありません。パブリックFunc >アクションを持つオブジェクトを返す 'CreateActor ' 'しかし、私は頭の上に何もないコンクリートを持っていません。 –

答えて

1

いいえ、可能ではないと思います。 usingステートメントの右側は、エイリアスを割り当てる前に実際の型に解決する必要があります。あなたのケースでは、右手側を解決するために、コンパイラは右辺を解決するために必要なalliasを完全に定義しなければなりません。この再帰的な問題は終わりがないので、コンパイラは明らかに気にするつもりはありません。問題は、ここでより明確にする

MyType mytype = x => Tuple<int, MyType>.Create(x, ???); 

私は戻り値を定義するための関数の本体で可能な置くことができる:コンパイラは、あなたの別名をコンパイルするために管理を前提とし、私はこれをしなかったことができます?最終的に私はどこかに戻って建設的な型を持つ必要があります。

+0

MyType myType = x =>タプル。作成(x + 1、(y)=> myType(y + x).Item2); –

+0

しかし、私はあなたが正しいと思う、このアプローチは結果よりも頭痛になります... –

0

ファイルの先頭にあるusingディレクティブについて言及し、MyTypeが存在すると仮定すると、可能です。たとえば、これは完全に法的です。

using System; 
using String = System.Func<System.String>; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      String myString =() => "Foo"; 
      // myString is now a function returning the string "Foo". Yikes. 
     } 
    } 
} 

つまり、コードレビューは私には決して伝わらないと言われています。混乱について話す。

+0

私は彼が望んでいるとは思えません: "文字列"を "Foo"に置き換え、関数を返した関数を返す関数があります。 –

+0

文字列の例では、 "型または名前空間名 'String'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?) " –

+0

コンパイルのために編集されました。 –

関連する問題