Error: "<method1>" and "<method2>" cannot overload each other
I redefine the list in VB.
In C #, the code compiles and looks like this:
class MyObjectCollection : IList
{
...
/// <summary>
/// Gets or sets the element at the specified index.
/// </summary>
public MyObject this[int index]
{
get { return (MyObject)innerArray[index]; }
set { innerArray[index] = value; }
}
...
}
in VB.NET I convert:
Class MyObjectCollection
Implements IList
...
''' <summary> '
''' Gets or sets the element at the specified index. '
''' </summary> '
Default Public Overrides Property Item(ByVal index As Integer) As MyObject
Get
Return DirectCast(innerArray(index), MyObject)
End Get
Set(ByVal value As MyObject)
innerArray(index) = value
End Set
End Property
...
End Class
Error:
'Open overrides the default property Item (index As Integer) Like MyObject' and 'Public Default Property Item (index As Integer) Like an object' cannot overload each other because they differ only in return types
The entire collection class in C #
public class MyObjectCollection : IList
{
private ArrayList innerArray;
public MyObjectCollection()
{
innerArray = new ArrayList();
}
public int Count
{
get { return innerArray.Count; }
}
public bool IsFixedSize
{
get { return false; }
}
public bool IsReadOnly
{
get { return false; }
}
public bool IsSynchronized
{
get { return false; }
}
object ICollection.SyncRoot
{
get { return null; }
}
public MyObject this[int index]
{
get { return (MyObject)innerArray[index]; }
set { innerArray[index] = value; }
}
public int Add(MyObject value)
{
int index = innerArray.Add(value);
return index;
}
public void AddRange(MyObject[] array)
{
innerArray.AddRange(array);
}
public void Clear()
{
innerArray.Clear();
}
public bool Contains(MyObject item)
{
return innerArray.Contains(item);
}
public bool Contains(string name)
{
foreach (MyObject spec in innerArray)
if (spec.Name == name)
return true;
return false;
}
public void CopyTo(MyObject[] array)
{
innerArray.CopyTo(array);
}
public void CopyTo(MyObject[] array, int index)
{
innerArray.CopyTo(array, index);
}
public IEnumerator GetEnumerator()
{
return innerArray.GetEnumerator();
}
public int IndexOf(MyObject value)
{
return innerArray.IndexOf(value);
}
public int IndexOf(string name)
{
int i = 0;
foreach (MyObject spec in innerArray)
{
if (spec.Name == name)
return i;
i++;
}
return -1;
}
public void Insert(int index, MyObject value)
{
innerArray.Insert(index, value);
}
public void Remove(MyObject obj)
{
innerArray.Remove(obj);
}
public void Remove(string name)
{
int index = IndexOf(name);
RemoveAt(index);
}
public void RemoveAt(int index)
{
innerArray.RemoveAt(index);
}
public MyObject[] ToArray()
{
return (MyObject[])innerArray.ToArray(typeof(MyObject));
}
#region Explicit interface implementations for ICollection and IList
void ICollection.CopyTo(Array array, int index)
{
CopyTo((MyObject[])array, index);
}
int IList.Add(object value)
{
return Add((MyObject)value);
}
bool IList.Contains(object obj)
{
return Contains((MyObject)obj);
}
object IList.this[int index]
{
get
{
return ((MyObjectCollection)this)[index];
}
set
{
((MyObjectCollection)this)[index] = (MyObject)value;
}
}
int IList.IndexOf(object obj)
{
return IndexOf((MyObject)obj);
}
void IList.Insert(int index, object value)
{
Insert(index, (MyObject)value);
}
void IList.Remove(object value)
{
Remove((MyObject)value);
}
#endregion
}
+3
4 answers
I suggest inheriting from CollectionBasethat exists specifically to create strongly typed collections.
Public Class MyObjectCollection
Inherits CollectionBase
Place an order example .
+1
, :
Private Property System.Collections.IList.Item(ByVal index As Integer) As Object
Get
Return Me.Item(index)
End Get
Set(ByVal value As Object)
Me.Item(index) = DirectCast(value, MyObject)
End Set
End Property
Public Default Property Item(ByVal index As Integer) As MyObject
Get
Return DirectCast(Me.innerArray.Item(index), MyObject)
End Get
Set(ByVal value As MyObject)
Me.innerArray.Item(index) = value
End Set
End Property
.
+1
, , :
Public Overrides Property Item(ByVal index As Integer) As MyObject
Get
Return DirectCast(innerArray(index), MyObject)
End Get
Set(ByVal value As MyObject)
innerArray(index) = value
End Set
End Property
IList, :
Public Property Item(ByVal index As Integer) As Object Implements IList.Item
Get
Return DirectCast(innerArray(index), MyObject)
End Get
Set(ByVal value As Object)
innerArray(index) = value
End Set
End Property
, , . , IList.
- :
Public Property IList_Item(ByVal index As Integer)As Object Implements IList.Item
Get
Return DirectCast(innerArray(index), MyObject)
End Get
Set(ByVal value As Object)
innerArray(index) = value
End Set
End Property
+1
EDIT: , # . IList:
object IList.this[int index]
{
get
{
return ((MyObjectCollection)this)[index];
}
set
{
((MyObjectCollection)this)[index] = (MyObject)value;
}
}
, .
VB.net, VB.net - , VB.net.
Alternatively, you will need to use the generic version of IList to create a custom indexer. Here is the C # version:
class MyObjectCollection : IList<MyObject>
{
private readonly MyObject[] innerArray;
public MyObject this[int index]
{
get { return (MyObject)innerArray[index]; }
set { innerArray[index] = value; }
}
}
0