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)