泛型类中T?可空参数赋值null报错问题求助
问题分析与解决
你遇到的编译错误核心原因是:C# 中T?的行为依赖泛型参数T的类型,而你的泛型约束仅指定T : IComparable,这允许T是引用类型(如string)或值类型(如int)。当T为值类型时,T?代表Nullable<T>,但编译器无法提前确认T是否支持可空修饰,因此直接用null作为默认值会触发转换错误。
适配整数类型场景的解决方案
针对你期望T为整数类型(值类型)的需求,只需修改泛型约束,添加struct限定确保T是值类型,即可解决编译问题:
[Serializable] public class ClampedValue<T> : IClamp<T> where T : struct, IComparable { internal T _value; [JsonIgnore] public T? Min { get; set; } = default; [JsonIgnore] public T? Max { get; set; } = default; public virtual T Value { get => _value; set { if (Max.HasValue && value.CompareTo(Max.Value) > 0) { _value = Max.Value; } else if (Min.HasValue && value.CompareTo(Min.Value) < 0) { _value = Min.Value; } else { _value = value; } } } [JsonConstructor] public ClampedValue(T value) { _value = value; } public ClampedValue(T value, T? min = null, T? max = null) { Min = min; Max = max; if (Min.HasValue && Max.HasValue) { if (Min.Value.CompareTo(Max.Value) >= 0) { throw new ArgumentException("ERROR: Min has to be lower than max!", nameof(min)); } } Value = value; } }
关键修改说明:
- 泛型约束新增
struct:where T : struct, IComparable,强制T为值类型,此时T?等价于Nullable<T>,可以合法使用null作为默认值。 - 调整
Nullable<T>的取值逻辑:通过HasValue判断是否存在有效值,用.Value获取实际值,避免直接对Nullable<T>调用CompareTo的潜在问题。 - 移除冗余空值判断:值类型的
value和_value不可能为null,相关空值检查代码可直接删除,简化逻辑。
内容的提问来源于stack exchange,提问作者Luk164
相关产品推荐
相关产品推荐

