C# 确定是否需要实例化泛型类类型
我有一个类C# 确定是否需要实例化泛型类类型,c#,generics,C#,Generics,我有一个类Data,用于存储通信链路上接收到的数据。Data类包含类型为T的Value属性和类型为DateTime的Timestamp属性 是否可以在类构造函数中确定请求类型的默认值为null,并在这种情况下实例化它 我已经研究了new()类约束。但是我在使用字符串类型的类时遇到了问题,因为我得到了关于字符串没有无参数构造函数的错误 下面是一个导致dataValue4.Value上出现NullReferenceException的示例,因为类型Foo的Value属性未实例化 public cla
Data
,用于存储通信链路上接收到的数据。Data
类包含类型为T
的Value
属性和类型为DateTime
的Timestamp
属性
是否可以在类构造函数中确定请求类型的默认值为null
,并在这种情况下实例化它
我已经研究了new()
类约束。但是我在使用字符串类型的类时遇到了问题,因为我得到了关于字符串没有无参数构造函数的错误
下面是一个导致dataValue4.Value
上出现NullReferenceException的示例,因为类型Foo
的Value
属性未实例化
public class Data<T> {
public Data() {
_timestamp = DateTime.Now;
}
private T _value;
public T Value {
get { return _value; }
set {
_value = value;
_timestamp = DateTime.Now;
}
}
private DateTime _timestamp;
public DateTime Timestamp {
get { return _timestamp; }
}
}
public class Foo {
public int Value1 { get; set; }
public bool Value2 { get; set; }
}
public class Program {
public static void Main() {
var dataValue1 = new Data<int>();
var dataValue2 = new Data<bool>();
var dataValue3 = new Data<string>();
var dataValue4 = new Data<Foo>();
//dataValue4.Value = new Foo();
Console.WriteLine(dataValue1.Value); // Output is "0"
Console.WriteLine(dataValue2.Value); // Output is "False"
Console.WriteLine(dataValue3.Value); // Output is ""
Console.WriteLine(dataValue4.Value.Value1); // Output is "0"
Console.WriteLine(dataValue4.Value.Value2); // Output is "False"
}
}
公共类数据{
公共数据(){
_timestamp=DateTime.Now;
}
私人T_值;
公共价值{
获取{返回_值;}
集合{
_价值=价值;
_timestamp=DateTime.Now;
}
}
私有日期时间\u时间戳;
公共日期时间戳{
获取{return\u timestamp;}
}
}
公开课Foo{
公共int值1{get;set;}
公共布尔值2{get;set;}
}
公共课程{
公共静态void Main(){
var dataValue1=新数据();
var dataValue2=新数据();
var dataValue3=新数据();
var dataValue4=新数据();
//dataValue4.Value=newfoo();
Console.WriteLine(dataValue1.Value);//输出为“0”
Console.WriteLine(dataValue2.Value);//输出为“False”
Console.WriteLine(dataValue3.Value);//输出为“”
Console.WriteLine(dataValue4.Value.Value1);//输出为“0”
Console.WriteLine(dataValue4.Value.Value2);//输出为“False”
}
}
您可以使用Activator创建实例
var type = typeof(T);
var value = Activator.CreateInstance(type) as T;
这将使用该类型的默认值创建一个实例 这实际上看起来像是希望
Foo
成为struct
而不是类。您可以强制数据
构造函数采用T
,但您仍然必须在数据
类之外创建Foo
,因为您不知道T
的构造函数需要什么。标记为重复的问题是否回答了您的问题?@Evk它实际上帮助我找到了一个有效的解决方案,但我不会说我的问题是“完全重复的”如信息中所述。我想添加我的解决方案作为答案,但我不能。是因为问题被标记了吗?是的,但我重新打开了它,因为我也觉得它不是重复的。如何将其用于值类型?它说我必须对类使用class
约束,这会在尝试使用值类型的类时导致错误。这不是使用值类型的最佳方法,请尝试使用default(T)