Constraint.LinkedList<K,T>' does not implement interface member 'System.Collections.IEnumerable.GetEnumerator()'. 'Constraint.LinkedList<K,T>.GetEnumerator()' cannot implement 'System.Collections.IEnumerable.GetEnumerator()' because it does not have the m
How to correct it? The code is from a sample on MSDN
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;namespace Constraint
{
class Node<K, T>
{
public K Key;
public T Item;
public Node<K, T> NextNode;
public Node()
{
Key = default(K);
Item = default(T);
NextNode = null;
}
public Node(K key, T item, Node<K, T> nextNode)
{
Key = key;
Item = item;
NextNode = nextNode;
}
}public class LinkedList<K, T> : IEnumerable<T> where K : IComparable<K>
{
Node<K, T> m_Head;public LinkedList()
{
m_Head = new Node<K, T>();
}public void AddHead(K key, T item)
{
Node<K, T> newNode = new Node<K, T>(key, item, m_Head.NextNode);
m_Head.NextNode = newNode;
}public T this[K key]
{
get
{
return Find(key);
}
}T Find(K key)
{
Node<K, T> current = m_Head;
while (current.NextNode != null)
{
if (current.Key.CompareTo(key) == 0)
{
break;
}
else
{
current = current.NextNode;
}
}
return current.Item;
}public IEnumerator<T> GetEnumerator()
{
Node<K, T> current = m_Head;
while (current != null)
{
yield return current.Item;
current = current.NextNode;
}
}public static LinkedList<K, T> operator +(LinkedList<K, T> lhs, LinkedList<K, T> rhs)
{
return concatenate(lhs, rhs);
}static LinkedList<K, T> concatenate(LinkedList<K, T> list1, LinkedList<K, T> list2)
{
LinkedList<K, T> newList = new LinkedList<K, T>();
Node<K, T> current;current = list1.m_Head;
while (current != null)
{
newList.AddHead(current.Key, current.Item);
current = current.NextNode;
}
current = list2.m_Head;
while (current != null)
{
newList.AddHead(current.Key, current.Item);
current = current.NextNode;
}
return newList;
}
}class Program
{
static void Main(string[] args)
{
LinkedList<int,string>list = new LinkedList<int,string>();
list.AddHead(123, "AAA");
list.AddHead(244, "BBB");
string item = list[123];
}
}
}
Réponses
How to correct it? The code is from a sample on MSDN
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;namespace Constraint
{
class Node<K, T>
{
public K Key;
public T Item;
public Node<K, T> NextNode;
public Node()
{
Key = default(K);
Item = default(T);
NextNode = null;
}
public Node(K key, T item, Node<K, T> nextNode)
{
Key = key;
Item = item;
NextNode = nextNode;
}
}public class LinkedList<K, T> : IEnumerable<T> where K : IComparable<K>
{
Node<K, T> m_Head;public LinkedList()
{
m_Head = new Node<K, T>();
}public void AddHead(K key, T item)
{
Node<K, T> newNode = new Node<K, T>(key, item, m_Head.NextNode);
m_Head.NextNode = newNode;
}public T this[K key]
{
get
{
return Find(key);
}
}T Find(K key)
{
Node<K, T> current = m_Head;
while (current.NextNode != null)
{
if (current.Key.CompareTo(key) == 0)
{
break;
}
else
{
current = current.NextNode;
}
}
return current.Item;
}public IEnumerator<T> GetEnumerator()
{
Node<K, T> current = m_Head;
while (current != null)
{
yield return current.Item;
current = current.NextNode;
}
}public static LinkedList<K, T> operator +(LinkedList<K, T> lhs, LinkedList<K, T> rhs)
{
return concatenate(lhs, rhs);
}static LinkedList<K, T> concatenate(LinkedList<K, T> list1, LinkedList<K, T> list2)
{
LinkedList<K, T> newList = new LinkedList<K, T>();
Node<K, T> current;current = list1.m_Head;
while (current != null)
{
newList.AddHead(current.Key, current.Item);
current = current.NextNode;
}
current = list2.m_Head;
while (current != null)
{
newList.AddHead(current.Key, current.Item);
current = current.NextNode;
}
return newList;
}
}class Program
{
static void Main(string[] args)
{
LinkedList<int,string>list = new LinkedList<int,string>();
list.AddHead(123, "AAA");
list.AddHead(244, "BBB");
string item = list[123];
}
}
}
You forgot to implement the non-generic version of GetEnumerator.
Here is the corrected code:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Constraint { class Node<K, T> { public K Key; public T Item; public Node<K, T> NextNode; public Node() { Key = default(K); Item = default(T); NextNode = null; } public Node(K key, T item, Node<K, T> nextNode) { Key = key; Item = item; NextNode = nextNode; } } public class LinkedList<K, T> : IEnumerable<T> where K : IComparable<K> { Node<K, T> m_Head; public LinkedList() { m_Head = new Node<K, T>(); } public void AddHead(K key, T item) { Node<K, T> newNode = new Node<K, T>(key, item, m_Head.NextNode); m_Head.NextNode = newNode; } public T this[K key] { get { return Find(key); } } T Find(K key) { Node<K, T> current = m_Head; while (current.NextNode != null) { if (current.Key.CompareTo(key) == 0) { break; } else { current = current.NextNode; } } return current.Item; } public IEnumerator<T> GetEnumerator() { Node<K, T> current = m_Head; while (current != null) { yield return current.Item; current = current.NextNode; } } public static LinkedList<K, T> operator +(LinkedList<K, T> lhs, LinkedList<K, T> rhs) { return concatenate(lhs, rhs); } static LinkedList<K, T> concatenate(LinkedList<K, T> list1, LinkedList<K, T> list2) { LinkedList<K, T> newList = new LinkedList<K, T>(); Node<K, T> current; current = list1.m_Head; while (current != null) { newList.AddHead(current.Key, current.Item); current = current.NextNode; } current = list2.m_Head; while (current != null) { newList.AddHead(current.Key, current.Item); current = current.NextNode; } return newList; } #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } #endregion } class Program { static void Main(string[] args) { LinkedList<int, string> list = new LinkedList<int, string>(); list.AddHead(123, "AAA"); list.AddHead(244, "BBB"); string item = list[123]; } } }
If you open your project, right-click the class name "LinkedList" then select "Implement Interface" the IDE will add this empty interface member for you.
Hugh
Hugh Moran - http://www.morantex.com- Proposé comme réponseHarry ZhuMSFT, Modérateurlundi 16 novembre 2009 09:54
- Marqué comme réponseHarry ZhuMSFT, Modérateurmercredi 18 novembre 2009 05:57
- Hi,
The nongeneric IEnumerator is required when implementing generic IEnumerable.
The following is experpted from: http://msdn.microsoft.com/en-us/library/78dfe2yb.aspx
Notes to Implementers:Implementing this interface requires implementing the nongeneric IEnumerator interface. The MoveNext and Reset methods do not depend on T, and appear only on the nongeneric interface. The Current property appears on both interfaces, and has different return types. Implement the nongeneric IEnumerator..::.Current property as an explicit interface implementation. This allows any consumer of the nongeneric interface to consume the generic interface.
Harry
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.- Proposé comme réponseHarry ZhuMSFT, Modérateurlundi 16 novembre 2009 09:54
- Marqué comme réponseHarry ZhuMSFT, Modérateurmercredi 18 novembre 2009 05:57
Toutes les réponses
How to correct it? The code is from a sample on MSDN
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;namespace Constraint
{
class Node<K, T>
{
public K Key;
public T Item;
public Node<K, T> NextNode;
public Node()
{
Key = default(K);
Item = default(T);
NextNode = null;
}
public Node(K key, T item, Node<K, T> nextNode)
{
Key = key;
Item = item;
NextNode = nextNode;
}
}public class LinkedList<K, T> : IEnumerable<T> where K : IComparable<K>
{
Node<K, T> m_Head;public LinkedList()
{
m_Head = new Node<K, T>();
}public void AddHead(K key, T item)
{
Node<K, T> newNode = new Node<K, T>(key, item, m_Head.NextNode);
m_Head.NextNode = newNode;
}public T this[K key]
{
get
{
return Find(key);
}
}T Find(K key)
{
Node<K, T> current = m_Head;
while (current.NextNode != null)
{
if (current.Key.CompareTo(key) == 0)
{
break;
}
else
{
current = current.NextNode;
}
}
return current.Item;
}public IEnumerator<T> GetEnumerator()
{
Node<K, T> current = m_Head;
while (current != null)
{
yield return current.Item;
current = current.NextNode;
}
}public static LinkedList<K, T> operator +(LinkedList<K, T> lhs, LinkedList<K, T> rhs)
{
return concatenate(lhs, rhs);
}static LinkedList<K, T> concatenate(LinkedList<K, T> list1, LinkedList<K, T> list2)
{
LinkedList<K, T> newList = new LinkedList<K, T>();
Node<K, T> current;current = list1.m_Head;
while (current != null)
{
newList.AddHead(current.Key, current.Item);
current = current.NextNode;
}
current = list2.m_Head;
while (current != null)
{
newList.AddHead(current.Key, current.Item);
current = current.NextNode;
}
return newList;
}
}class Program
{
static void Main(string[] args)
{
LinkedList<int,string>list = new LinkedList<int,string>();
list.AddHead(123, "AAA");
list.AddHead(244, "BBB");
string item = list[123];
}
}
}
You forgot to implement the non-generic version of GetEnumerator.
Here is the corrected code:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Constraint { class Node<K, T> { public K Key; public T Item; public Node<K, T> NextNode; public Node() { Key = default(K); Item = default(T); NextNode = null; } public Node(K key, T item, Node<K, T> nextNode) { Key = key; Item = item; NextNode = nextNode; } } public class LinkedList<K, T> : IEnumerable<T> where K : IComparable<K> { Node<K, T> m_Head; public LinkedList() { m_Head = new Node<K, T>(); } public void AddHead(K key, T item) { Node<K, T> newNode = new Node<K, T>(key, item, m_Head.NextNode); m_Head.NextNode = newNode; } public T this[K key] { get { return Find(key); } } T Find(K key) { Node<K, T> current = m_Head; while (current.NextNode != null) { if (current.Key.CompareTo(key) == 0) { break; } else { current = current.NextNode; } } return current.Item; } public IEnumerator<T> GetEnumerator() { Node<K, T> current = m_Head; while (current != null) { yield return current.Item; current = current.NextNode; } } public static LinkedList<K, T> operator +(LinkedList<K, T> lhs, LinkedList<K, T> rhs) { return concatenate(lhs, rhs); } static LinkedList<K, T> concatenate(LinkedList<K, T> list1, LinkedList<K, T> list2) { LinkedList<K, T> newList = new LinkedList<K, T>(); Node<K, T> current; current = list1.m_Head; while (current != null) { newList.AddHead(current.Key, current.Item); current = current.NextNode; } current = list2.m_Head; while (current != null) { newList.AddHead(current.Key, current.Item); current = current.NextNode; } return newList; } #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } #endregion } class Program { static void Main(string[] args) { LinkedList<int, string> list = new LinkedList<int, string>(); list.AddHead(123, "AAA"); list.AddHead(244, "BBB"); string item = list[123]; } } }
If you open your project, right-click the class name "LinkedList" then select "Implement Interface" the IDE will add this empty interface member for you.
Hugh
Hugh Moran - http://www.morantex.com- Proposé comme réponseHarry ZhuMSFT, Modérateurlundi 16 novembre 2009 09:54
- Marqué comme réponseHarry ZhuMSFT, Modérateurmercredi 18 novembre 2009 05:57
- Can you esplain the code "#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
#endregion"
I don't know why it is necessary.
. Thank you - Hi,
The nongeneric IEnumerator is required when implementing generic IEnumerable.
The following is experpted from: http://msdn.microsoft.com/en-us/library/78dfe2yb.aspx
Notes to Implementers:Implementing this interface requires implementing the nongeneric IEnumerator interface. The MoveNext and Reset methods do not depend on T, and appear only on the nongeneric interface. The Current property appears on both interfaces, and has different return types. Implement the nongeneric IEnumerator..::.Current property as an explicit interface implementation. This allows any consumer of the nongeneric interface to consume the generic interface.
Harry
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.- Proposé comme réponseHarry ZhuMSFT, Modérateurlundi 16 novembre 2009 09:54
- Marqué comme réponseHarry ZhuMSFT, Modérateurmercredi 18 novembre 2009 05:57

