2012-01-10 6 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으로 설정하는 것을 잊지 않았습니까? 모노 2.10.8과 함께 나를 위해 작동합니다. 그것은 또한 일부 안드로이드 특정 제한 (명시 적으로 명시되지 않은 here 부분적으로 나열된 지원) 수 있습니다.

+0

최신 모노 도이드 버전을 사용하고 있습니다. 나는 안드로이드 2.2를 목표로하고 있지만, monodroid 안드로이드 애플리케이션 프로젝트를위한 clr/C#의 타겟 버전을 어디에 설정해야할지 모르겠다. 나는 Visual studio 2010을 사용하고 있습니다. 위의 (공생하는 generics)가 단일 독점 프로젝트에서 여러분에게 도움이 되었습니까? 코드를 게시 할 수 있습니까? 감사. – IUnknown

+0

모노 독으로 작동하는지 확인할 수 없습니다. 가지고 있지 않습니다. 나는 공변량이 그곳에서 작동 하는지를 확인하기 위해 Linux의 일반적인 Mono 프로젝트에서 코드를 사용했다. 그리고 그들은 그렇습니다. 또한 오류 메시지는 마치 4.0 이전 프레임 워크의 클래스를 사용한 것과 같습니다. 그러나 IEnumerable Monodroid 구현이 공변수가 아닐 수도 있습니다. 일반적으로 응용 프로그램 탭의 프로젝트 속성에서 프레임 워크 버전을 설정할 수 있습니다. 그것이 Monodroid 프로젝트에서 같은 방법으로 수행 될 수 있는지 나는 모른다. –

+0

또한 모노 도이드 구현이 공변 적이 지 않은 것으로 의심됩니다. 모든 속성과 설정을 사방으로 검색하여 단원 프로젝트에서 대상 C#/clr 버전을 지정하는 방법을 찾지 못했습니다. 감사. – IUnknown

0

generics에 대한 공변 지원이 없으므로 추한 코드가 발생하므로이 문제로 돌아가 시뮬레이션 된 공변 효과를 허용하는 간단한 해킹이 발생했습니다.

나는 이것을 더 간단하게 만드는 것에 대한 피드백을 원합니다. 또한 나는 성과 - 모든 생각에 대해 우려하고 있습니다. 아직 완벽하지는 않지만 다른 코드를 정리할 수 있습니다.

다음은 단원에서 공변량 제네릭을 시뮬레이트하는 새로운 코드 샘플입니다.

[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; } 
}