i am working on someone else code i need to add few things i have a class
public abstract class Data<T>
{
}
public class StringData : Data<string>
{
}
public class DecimalData : Data<decimal>
{
}
in my program i want to maintain list of different type of data
List<Data> dataCollection=new List<Data>();
dataCollection.Add(new DecimalData());
dataCollection.Add(new stringData());
List<Data> dataCollection=new List<Data>();
at above line i am getting compiler error Using the generic type 'Data' requires 1 type arguments
Can any one guide what i am doing wrong;
There is no diamond operator in C# yet, so you can't use true polymorphism on open generic type underlying to closed constructed types.
So you can't create a list like this:
List<Data<>> list = new List<Data<>>();
You can't use polymorphism on such list... and it is a lack in genericity here.
For example, in C# you can't create a List<Washer<>>
instance to have some Washer<Cat>
and some Washer<Dog>
to operate Wash()
on them...
All you can do is using a list of objects or an ugly non generic interface pattern:
public interface IData
{
void SomeMethod();
}
public abstract class Data<T> : IData
{
public void SomeMethod()
{
}
}
List<IData> list = new List<IData>();
foreach (var item in list)
item.SomeMethod();
You can also use a non generic abstract class instead of an interface:
public abstract class DataBase
{
public abstract void SomeMethod();
}
public abstract class Data<T> : DataBase
{
public override void SomeMethod()
{
}
}
List<DataBase> list = new List<DataBase>();
foreach (var item in list)
item.SomeMethod();
But you lost some genericity design and strong-typing...
And you may provide any non-generic behavior such as properties and methods you need to operate on.
Generics open and closed constructed types
C# variance problem: Assigning List<Derived> as List<Base>
How to do generic polymorphism on open types in C#?
C#: Is Variance (Covariance / Contravariance) another word for Polymorphism?
C# generic inheritance and covariance part 2
still confused about covariance and contravariance & in/out
You don't need to use generics for that.
public abstract class Data {
}
public class StringData : Data {
}
public class DecimalData : Data {
}
List<Data> dataCollection = new List<Data>();
dataCollection.Add(new DecimalData());
dataCollection.Add(new StringData());
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.