2010-08-12 4 views
1

Что я могу использовать вместо «длинного», который может быть клонированным?Что я могу использовать вместо «длинного», который может быть клонированным?

См. Ниже код, за который я получаю сообщение об ошибке здесь, поскольку он не является клонированным.

public static CloneableDictionary<string, long> returnValues = new CloneableDictionary<string, long>(); 

EDIT: Я забыл упомянуть, что хотел использовать следующий код, который я нашел (см. Ниже).

public class CloneableDictionary<TKey, TValue> : Dictionary<TKey, TValue> where TValue : ICloneable 
{ 
    public IDictionary<TKey, TValue> Clone() 
    { 
     var clone = new CloneableDictionary<TKey, TValue>(); 

     foreach (KeyValuePair<TKey, TValue> pair in this) 
     { 
      clone.Add(pair.Key, (TValue)pair.Value.Clone()); 
     } 
     return clone; 
    } 
} 
+0

** Почему **? Что ты пытаешься сделать? Что такое 'CloneableDictionary'? – SLaks

+0

Откуда возникает класс CloneableDictionary? –

+0

извините - обновили вопрос – Greg

ответ

6

Нет смысла клонировать long.

Вы должны использовать обычный Dictionary<string, long>.

Если вы хотите клонировать сам словарь, вы можете написать new Dictionary<string, long>(otherDictionary).

+0

извините - обновили вопрос – Greg

+0

@ Высказывания вашего комментария re «f вы хотите клонировать сам словарь, вы можете написать новый словарь (otherDictionary)», установил меня прямо - спасибо – Greg

+0

, что даст вам мелкий клон. То есть клоном коллекции, но не элементами в ней. –

1
public class CloneableDictionary<TKey, TValue> : Dictionary<TKey, TValue> 
{ 
    public IDictionary<TKey, TValue> Clone() 
    { 
     var clone = new CloneableDictionary<TKey, TValue>(); 

     foreach (KeyValuePair<TKey, TValue> pair in this) 
     { 
      ICloneable clonableValue = pair.Value as ICloneable; 
      if (clonableValue != null) 
       clone.Add(pair.Key, (TValue)clonableValue.Clone()); 
      else 
       clone.Add(pair.Key, pair.Value); 
     } 

     return clone; 
    } 
} 
+0

Почему бы не «MemberwiseClone»? (http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx) –

+0

Это совсем не обязательно для словаря , который OP будет использовать для него, поскольку String и Int64 неизменяемы. Кроме того, такой дизайн неправильно подразумевает, что он поддерживает все типы TValue, но если вы передали ему TValue, который не реализует ICloneable, тогда он не сможет выполнить то, что он утверждает. TValue должно быть ограничено, чтобы быть ICloneable, но, как я уже сказал, это не помогает OP. – Josh

+0

@ Steven Sudit, потому что он делает мелкую копию? Теперь вполне возможно, что ОП просто неправильно понял свою задачу, а мелкая копия - то, что ему нужно, но я работаю с тем, что мне дано. @Josh Einstein Да, 'CloneableDictionary' не изменяет тот факт, что примитивные типы не нужно клонировать в первую очередь. Однако я не согласен с вашим определением «fail». Он пытается выполнить то, что требуется, затем возвращается к поведению по умолчанию. Это имеет для меня смысл. Да, наличие 'CloneableDictionary ' совершенно бессмысленно, но это не единственное возможное использование для него. –