2017-09-26 100 views
0

鑑於以下接口,我不明白爲什麼ITransactionConsumer上定義的第二種方法不能編譯。編譯器抱怨說它不能轉換爲ITransaction<IUser> - 但是有一個通用的約束,即TUserIUser ..?C#泛型 - 泛型接口轉換錯誤

public interface ITransactionConsumer 
    { 
     //fine 
     PaymentSession<TTransaction> ConsumeTransaction<TTransaction>(TTransaction transaction) 
      where TTransaction : ITransaction<IUser>; 

     //compile error - TTransaction is not convertable to ITransaction<IUser> 
     PaymentSession<TTransaction> ConsumeTransactionWithTUser<TTransaction, TUser>(TTransaction transaction) 
      where TTransaction : ITransaction<TUser> where TUser : IUser; 
    } 

    public class PaymentSession<TTransaction> 
     where TTransaction : ITransaction<IUser> 
    { 
    } 

    public interface ITransaction<out TUser> 
     where TUser : IUser 
    { 
     TUser User { get; } 
     string Id { get; } 
    } 

    public interface IUser 
    { 
     string Name { get; } 
    } 
+1

看起來你需要爲'TUser'添加一個類約束,即'where TUser class,IUser'。 – Lee

+0

我得到一個不同的編譯錯誤:嚴重\t代碼\t說明\t項目\t文件\t線\t抑制狀態 錯誤\t CS0314 \t類型「通訊交易」不能在泛型類型或方法「PaymentSession <被用作類型參數「通訊交易」通訊交易>」。沒有從'TTransaction'到'ITransaction '的裝箱轉換或類型參數轉換。 –

回答

1

您能否用此代替您的違規行?

PaymentSession<TTransaction> ConsumeTransactionWithTUser<TTransaction, TUser>(TTransaction transaction) 
    where TTransaction : ITransaction<TUser>, ITransaction<IUser> where TUser : IUser; 

編輯: 自那工作過,最正確的做法(什麼,我希望你打算用你的代碼)將使用您在第一ConsumeTransaction聲明中使用的語法:

PaymentSession<TTransaction> ConsumeTransactionWithTUser<TTransaction, TUser>(TTransaction transaction) 
    where TTransaction : ITransaction<IUser>; 

您犯的錯誤涉及您的PaymentSession返回值。您的PaymentSession類表示它可以接受的類型參數的約束。您定義的類型參數作爲通訊交易,然後指定通訊交易必須實現具有IUSER作爲其類型參數的接口ITransaction。但是你又試圖聲明函數ConsumeTransactionWithTUser其中通訊交易是實現IUSER一種類型的返回類型PaymentSession的。實現接口的類型與接口本身不一樣! PaymentSession的類型必須爲IUSER凹口 - 是你指定的約束,這也就是爲什麼編譯器抱怨:ITransaction < TUSER>是不一樣的ITransaction < IUSER>

爲了結束:您在PaymentSession類約束要求泛型類型爲類型ITransaction < IUSER>凹口 - 比說,PaymentSession要求泛型類型是通用型的更嚴格ITransaction接受實施IUser的類型。

+0

這很有效!仍然有點困惑,爲什麼這是必要的,但這就是我需要的。謝謝,將標記爲正確。 – thisextendsthat

+2

一個好的答案應該包括解釋以及代碼。否則沒有人學到任何東西。 – Chris

+0

處理解釋 - 將在下次休息時提供。 – Jazimov