2012-01-10 3 views
2

編集: 共変ジェネリックはまだサポートされていないようです。次のリリースでそれを確認するには、Xamarinに電子メールでこの機能をリクエストしてください。Monodroidジェネリックは共変しませんか?

次のコードはエラーを示しています(linq文)。同じコードがMicrosoft clr c#4.0で正常に動作します。

エラー:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<LinqTest.Person>' to 'System.Collections.Generic.IEnumerable<LinqTest.Entity>'. An explicit conversion exists (are you missing a cast?) 

コード:私は修正または私は何かが欠けています

[Activity(Label = "LinqTest", MainLauncher = true, Icon = "@drawable/icon")] 
public class Activity1 : Activity { 

    protected override void OnCreate(Bundle bundle) { 
     base.OnCreate(bundle); 

     var names = new List<string> { 
             "Joe", 
             "Bob", 
             "Jim", 
             "Jane" 
            }; 

     IEnumerable<Entity> query = 
      from e in names 
      select new Person() {Name = e}; 

     SetContentView(Resource.Layout.Main); 

     var button = FindViewById<Button>(Resource.Id.MyButton); 

     button.Click += delegate { 
          button.Text = string.Format("{0}", query.Count()); 
         }; 
    } 
} 

public class Entity { 
    public string Name { get; set; } 
} 

public class Person : Entity { 
    public string Workplace { get; set; } 
} 

public class Animal : Entity { 
    public string FurColour { get; set; } 
} 

アム?もしそうなら、これをリファクタリングするための推奨事項はありますか?

また、そうであれば、これは単変量 - 共変一般的サポートのための正式な機能要求を考慮してください。 :)

ありがとうございました。

答えて

5

Android用のMonoTouchもMonoも現在のところ共分散をサポートしていません。これは将来のリリースでサポートされる予定です(おそらく、今年の後半になるでしょう)。

+0

ありがとう - 私はこの機能を楽しみにしています。 – IUnknown

0

フレームワークのバージョンを4.0に設定するのを忘れていませんか? Mono 2.10.8で私のために動作します。それはまたいくつかのアンドロイドの特定の制限(明示されていないが、 hereに記載されている部分的なサポート)でもあるかもしれません。

+0

最新版のモノドローイングを使用しています。私はアンドロイド2.2をターゲットにしていますが、monodroidアンドロイドアプリケーションプロジェクトのためにclr/c#のターゲットバージョンをどこに設定するのかはわかりません。私はVisual studio 2010を使用しています。上記(共変ジェネリックス)はモノドロイドプロジェクトであなたのために機能しましたか?あなたはコードを投稿できますか?ありがとう。 – IUnknown

+0

モノドロイドで動作するかどうかチェックできません - 持っていません。私はあなたのコードをLinux上の通常のMonoプロジェクトで使用して、共変量がそこで動作するかどうかを確認しました。そして、彼らはそうする。また、エラーメッセージは、4.0より前のフレームワークのクラスを使用しているかのようです。しかし、MonodroidのIEnumerable 実装も共変ではないかもしれません。通常、appliactionタブのプロジェクトプロパティでフレームワークバージョンを設定できます。 Monodroidプロジェクトで同じことができるかどうかはわかりません。 –

+0

私は単極子の実装が非共変型であると考えています。私はすべてのプロパティと設定をどこからでも検索し、モノドロイドプロジェクトでターゲットとなるC#/ clrのバージョンを指定する方法を見つけることができませんでした。ありがとう。 – IUnknown

0

一般的な共変のサポートがないとコードが醜いので、私はこの問題に戻り、シンプルな共変効果を可能にする単純なハックを思いつきました。

これをさらに簡単にするためのフィードバックをお寄せください。また、私はパフォーマンスについて懸念しています - あらゆる考え。まだ完全ではありませんが、他のコードを整理することができます。

ここでは、モノドローイング上の共変ジェネリックをシミュレートする新しいコードサンプルを示します。

[Activity(Label = "CovariantTest", MainLauncher = true, Icon = "@drawable/icon")] 
public class Activity1 : Activity { 
    int count = 1; 

    protected override void OnCreate(Bundle bundle) { 
     base.OnCreate(bundle); 

     SetContentView(Resource.Layout.Main); 

     Button button = FindViewById<Button>(Resource.Id.MyButton); 

     var names = new List<string> { 
             "Joe", 
             "Bob", 
             "Jim", 
             "Jane" 
            }; 

     IEnumerable<Entity>query = 
      (from e in names 
      select (new Person() { Name = e }) as Entity).ToList(); 

     Person p = query[2] as Person; 

     button.Click += delegate { button.Text = string.Format("{0}", p.Test()); }; 
    } 
} 

public class Entity { 
    public string Name { get; set; } 
} 

public class Person : Entity { 
    public string Workplace { get; set; } 
    public string Test() { 
     return "I am a person"; 
    } 
} 

public class Animal : Entity { 
    public string FurColour { get; set; } 
} 
関連する問題