2014-01-16 54 views
3
public interface SomeInterfaceName<out T> where T : struct 
    { 
    T? SomePropertyName { get; } 
    } 

我得到的錯誤是:當創建差異接口

錯誤CS1961:無效的方差:類型參數「T」必須是「SomeInterfaceName.SomePropertyName」目不暇接有效。 'T'是協變的。

我不要需要這是協變。我也可以刪除out關鍵字。但是,然後Resharper建議我可以使用Covariance,我同意,我不明白爲什麼我不能。我只使用T作爲返回值。還是因爲可空<>不支持它?

任何人都可以解釋錯誤嗎?

回答

4

使用struct約束協變來製作類型參數是毫無意義的。根本不支持值類型類型參數的通用差異 - 例如,即使存在從intlongobject的轉換,也沒有從IEnumerable<int>IEnumerable<long>IEnumerable<object>的轉換。

您實際遇到的問題是Nullable<T>不是協變的,但您嘗試在Nullable<T>類型的屬性中使用T。這就是導致錯誤的原因。

就我個人而言,如果輸入參數與struct約束不能被聲明爲協變或逆變(因爲它不會有用),但它本身並不被禁止,我個人認爲會更好。