2012-08-03 62 views
0

如果我有一個類接受來自IUSER派生泛型類型,我怎麼能避免此錯誤消息接口使用泛型「無法隱式轉換類型」

不能鍵入ElimCMS.Service.Users.someclass<ElimCMS.DataModel.Users.User>隱式轉換爲ElimCMS.Service.Users.Isomeclass<ElimCMS.DataModel.Users.IUser>。一個顯式轉換存在(是否缺少強制轉換?)

public interface Isomeclass<TUser> 
    where TUser : class, IUser 
    { 

    string test(TUser user); 
    TUser returnUser(); 
    } 

    public class someclass<TUser> : Isomeclass<TUser> 
    where TUser : class, IUser, new() 
    { 
    public string test(TUser user) 
    { 
     string email = user.EMail; 
     user.EMail = "changed:" + email; 

     return email; 
    } 


    public TUser returnUser() 
    { 
     throw new NotImplementedException(); 
    } 
} 

Isomeclass<ElimCMS.DataModel.Users.IUser> servicetest = new someclass<ElimCMS.DataModel.Users.User>(); 
+0

您正在使用哪種C#版本? – Arcturus 2012-08-03 13:29:20

回答

4

這是因爲generi具有不同類型的cs與彼此不兼容。爲了解決這個問題,你可以聲明泛型參數來Isomeclass使用

public interface Isomeclass<out TUser> 
    where TUser : class, IUser 
{ 

    string test(TUser user); 
    TUser returnUser(); 
} 

然而,這將打破test方法,因爲它不再是類型安全進行協變的。爲了解決這個問題,您可以將參數user類型更改爲IUser,它將像以前一樣工作。

這取決於您使用的C#版本。對於一些舊版本,泛型不能聲明爲協變,這意味着您必須將賦值目標更改爲與分配給它的對象相同的類型。

1

更改聲明

public interface Isomeclass<TUser> where TUser : class, IUser 
{ 
    string test(TUser user); 
    TUser returnUser(); 
} 

public interface Isomeclass<out TUser> where TUser : class, IUser 
{ 
    string test(IUser user); 
    TUser returnUser(); 
} 

,並適當地重新定義test方法在someclass<TUser>匹配。

如果您使用C#4(Visual Studio 2010)或更高版本,則可以執行此操作。那會得到你所需要的。如果您使用的是以前的版本,那麼您必須恢復到object並進行一些鑄造。

1

someclass<ElimCMS.DataModel.Users.User>不是分配兼容的。實際上,和Isomeclass<ElimCMS.DataModel.Users.User>不能被分配給對方。

由於您希望使用類型參數TUser指定的類型作爲輸入參數和輸出參數,因此不能將類型參數聲明爲協變或逆變,因此唯一的解決方案是在接口中保留當前方法簽名/班似乎是鍵入列表實例IUser

new someclass<ElimCMS.DataModel.Users.IUser>(); 

或鍵入您的列表變量User

Isomeclass<ElimCMS.DataModel.Users.User> servicetest