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];
}
}
}
Risposte
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- Proposto come rispostaHarry ZhuMSFT, Moderatorlunedì 16 novembre 2009 9.54
- Contrassegnato come rispostaHarry ZhuMSFT, Moderatormercoledì 18 novembre 2009 5.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.- Proposto come rispostaHarry ZhuMSFT, Moderatorlunedì 16 novembre 2009 9.54
- Contrassegnato come rispostaHarry ZhuMSFT, Moderatormercoledì 18 novembre 2009 5.57
Tutte le risposte
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- Proposto come rispostaHarry ZhuMSFT, Moderatorlunedì 16 novembre 2009 9.54
- Contrassegnato come rispostaHarry ZhuMSFT, Moderatormercoledì 18 novembre 2009 5.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.- Proposto come rispostaHarry ZhuMSFT, Moderatorlunedì 16 novembre 2009 9.54
- Contrassegnato come rispostaHarry ZhuMSFT, Moderatormercoledì 18 novembre 2009 5.57

