![](/img/trans.png)
[英]Can C# 4.0 variance help me call a base class constructor with an upcast?
[英]Help using variance in C# 4.0
這是問題所在。 我想創建一個包含配置數據的類。 此數據由鍵/值對組成。 一些示例:“ hostName” =“ localhost”,“ timeout” = 1000,等等。我最初的想法是將所有這些存儲在通用字典中:
private Dictionary<string, ConfigurationItem<object>> Configuration =
new Dictionary<string, ConfigurationItem<object>>();
並且ConfigurationItem類為:
public class ConfigurationItem<T>
{
public string Name { get; set; }
public T Value { get; set; }
}
我希望可以查詢和設置以下配置:
int i = Configuration.Get<int>("Timeout");
Configuration.Set("Timeout", 1000);
不幸的是,我無法使用以下代碼在配置字典中插入項目:
public void SetValue<T>(string key, ConfigurationItem<T> value)
{
if (Configuration.ContainsKey(key.ToUpper()))
Configuration[key.ToUpper()] = **value**;
else
Configuration.Add(key.ToUpper(), **value**);
}
粗體部分顯示錯誤:
無法將類型ConfigurationItem <T>轉換為ConfigurationItem <Object>
我正在使用C#4.0,因為我希望使用新的差異功能來解決此問題,但到目前為止還沒有運氣。 如果需要更多信息,只需命名! 謝謝你的幫助!
C#4.0中的協方差和協變僅適用於接口和委托。
您必須在類型參數前加上in
或out
前綴,具體取決於接口成員定義中類型參數用法的位置。
例如:
public interface IConfigurationItem<out T>
{
public string Name { get; set; }
public T Value { get; set; }
}
因為IDictionary<TKey,TValue>
將其類型參數同時用於輸入和輸出,所以字典不是協變的也不是協變的。
來自C#4.0規范草案的方差限制
23.3限制協變量和反變量類型參數只能在接口和委托類型上聲明。 協方差和矛盾方差僅在類型參數之間存在引用(或同一性)轉換時適用。 例如, IEnumerable<int>
不是IEnumerable<object>
因為從int到object的轉換是裝箱轉換,而不是引用轉換。
您可以將Dictionary定義為私有Dictionary <string,object>,並在從Get方法返回它們之前對對象進行轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.