泛型方法接收可空值,返回空或非可空值的实现问题
问题解决:将可空值转换为非可空泛型FieldDescription实例
错误原因分析
你遇到的编译错误核心是泛型类型推断不匹配:
user.UserData?.SearchArea是int?(可空int)类型,调用GetFieldDescriptionOrNull时,泛型参数T会被自动推断为int?,导致方法返回FieldDescription<int?>?。- 但
profile.SearchArea的类型是FieldDescription<int>?,两种类型无法隐式转换,因此报错。
解决方案:重载方法处理可空值类型
给GetFieldDescriptionOrNull添加一个专门针对值类型可空类型的重载方法,让它接收T?并返回FieldDescription<T>?,完美匹配你的需求:
public class FieldDescription<T> { public T Value { get; set; } public bool IsDisabled { get; set; } } public class UserProfile { public FieldDescription<int>? SearchArea { get; set; } //... } // 原方法:处理引用类型/非可空值类型 private FieldDescription<T>? GetFieldDescriptionOrNull<T>(T value) where T : class { if (value == null) return null; return new FieldDescription<T> { Value = value }; } // 新增重载:处理值类型的可空类型 private FieldDescription<T>? GetFieldDescriptionOrNull<T>(T? value) where T : struct { if (!value.HasValue) return null; return new FieldDescription<T> { Value = value.Value }; }
调用方式
现在直接调用即可,编译器会自动匹配正确的重载:
profile.SearchArea = GetFieldDescriptionOrNull(user.UserData?.SearchArea);
这个方案完全符合你的需求:
- 当
user.UserData?.SearchArea为null时,返回FieldDescription<int>? = null - 当
user.UserData?.SearchArea有值时,返回FieldDescription<int>实例
内容的提问来源于stack exchange,提问作者VladL
相关产品推荐
相关产品推荐

