是否可以创建使用nullable int作为泛型参数的类?

时间:2013-12-27 16:04:41

标签: c# .net generics int nullable

我正在尝试创建一个名为Stats的类,它使用泛型参数T.我打算用T作为int?还是漂浮?但是,当我尝试创建类Stats的对象时,我得到了: 错误1类型'int?'必须是不可为空的值类型才能在泛型类型或方法中将其用作参数“T”.... 任何帮助将不胜感激

这是我的代码:

Stats<int?> stats = new PlayerMatchStats(); // PlayerMatchStats inherits Stats


public abstract class Stats<T> : BaseEntity where  T : struct 
{

}

2 个答案:

答案 0 :(得分:4)

the C# programming guide开始,当指定where T : struct的通用约束时,“type参数必须是值类型。可以指定除Nullable之外的任何值类型。”

您可以使用结构约束可为空来创建泛型类的成员,例如

public class Foo<T> where T : struct
{
   public T? SomeValue { get; set; }
}

但您无法提供可为空的封闭泛型类型。

答案 1 :(得分:1)

where T : struct不允许可以为空的类型。也许这种重构就是你所追求的:

public abstract class Stats<T> where T : struct
{
    // instead of the following with T being int?
    // public abstract T Something { get; }
    // have the following with T being int
    public abstract T? Something { get; }
}
public class PlayerMatchStats : Stats<int> { ... }

// this is now valid:
Stats<int> stats = new PlayerMatchStats();

或删除struct约束:

public abstract class Stats<T>
{
    public abstract T Something { get; }
}
public class PlayerMatchStats : Stats<int?>
{
    public override int? Something { get { return 0; } }
}

Stats<int?> stats = new PlayerMatchStats();