2012-07-12 213 views
0

我有以下類別:泛型:類型不能隱式轉換

public interface IWaybillDocument 
    { 
     long DocumentId { get; set; } 
     long BillingDocumentId { get; set; } 

     string ShipToName { get; set; } 
     byte AddressType { get; set; } 
     string City { get; set; } 
     string Country { get; set; } 
     string PostCode { get; set; } 
     string StateRegion { get; set; } 
     string Street1 { get; set; } 
     string Street2 { get; set; } 
     string Suburb { get; set; } 

     void MergeAddressing(Address address); 
    } 
} 

    public class WaybillDocumentList : ERPListBase<IWaybillDocument> 
    { 
     public WaybillDocumentList() : base() { } 
    } 

public partial class WaybillDocument : IWaybillDocument, INonrepudiable 
    { 

     public void MergeAddressing(Address address) 
     { 
      address.Street1 = this.Street1; 
      address.Street2 = this.Street2; 
      address.Suburb = this.Suburb; 
      address.City = this.City; 
      address.ZipCode = this.PostCode; 
      address.StateRegion = this.StateRegion; 
      address.Country = this.Country; 
      address.AddressKind = (AddressKind)this.AddressType; 
     } 
    } 

他們都編譯很好,但嘗試應用這種擴展方法時:

public static EntitySet<T> ToEntitySetFromInterface<T, U>(this IList<U> source) 
      where T : class, U 
     { 
      var es = new EntitySet<T>(); 
      IEnumerator<U> ie = source.GetEnumerator(); 
      while (ie.MoveNext()) 
      { 
       es.Add((T)ie.Current); 
      } 
      return es; 
     } 

像這樣:

public void InsertWaybills(WaybillDocumentList waybills) 
     { 
      try 
      { 
       ; 
       this.Context.WaybillDocuments.InsertAllOnSubmit(waybills.ToEntitySetFromInterface<WaybillDocument, IWaybillDocument>()); 
       this.Context.SubmitChanges(); 
      } 
      catch (Exception ex) 
      { 
       throw new DALException("void InsertWaybills(WaybillList waybills) failed : " + ex.Message, ex); 
      } 
     } 

我收到編譯錯誤

類型「WaybillDocument」不能用作 一般類型的類型參數「T」或方法 「LinqExtensions.ToEntitySetFromInterface(System.Collections.Generic.IList)」。 有從 'WaybillDocument' 沒有隱式引用轉換到 'IWaybillDocument'

waybills.ToEntitySetFromInterface<WaybillDocument, IWaybillDocument>() 

下劃線。爲什麼當它明確地繼承接口?

UPDATE:ERPListBase(詳細信息刪除)

public class ERPListBase<T> : List<T> 
{ 
    public ERPListBase() 
     : base() {} 
} 
+0

您尚未提供ERPListBase的代碼。您對InsertAllOnSubmit的調用假定ERPListBase具有IList 接口。不確定,但如果我們看到ERPListBase的代碼,它會有所幫助。 – 2012-07-12 10:31:31

+0

waybills.ToEntitySetFromInterface (collection namehere) – MMK 2012-07-12 10:31:53

+1

btw。你可以簡化你向EntitySet添加項目的實現:'es.AddRange(source.Cast ());' – Rytmis 2012-07-12 10:43:26

回答

1

我貼你的代碼,以新項目,並與像ERPListBase小的修改 - >列表並將其編譯。所以我的猜測是你有兩個名爲IWaybillDocument的接口,並且你在某處引用了錯誤的接口。

+0

好吧,我剛剛得到了RedGate反射器最新版本,它也有一個VS插件,並以某種方式緩存舊代碼並將其注入到構建中。因此,即使是在IDE中的所有內容都被正確地引用了,如果你看看輸出反彙編,它實際上會引用代碼文件和其他文件,這些文件是天之前的。實際上,實際上有3個同類和redgate反射器決定在構建中使用哪一個。我只想要一個體面的類瀏覽器,而不是一個無形的「手」。浪費時間。 :( – rism 2012-07-12 11:24:47