为何无法使用C#的SET关键字为double类型属性赋值字符串?
C#属性相关问题解答
一、set关键字的作用
set是C#属性的赋值访问器,核心作用是定义属性被赋值时的逻辑:当外部代码给属性赋值时,set块会把赋值语句右侧的值(通过内置的value变量获取),按照你写的逻辑处理后,存储到对应的字段里。
你原代码里存在两个问题:一是low_bound是double?(可空双精度浮点数)类型,外部直接给它赋值字符串会编译报错——类型不匹配,set里的value此时是double?类型,根本接收不了字符串;二是属性直接返回low_bound会导致无限递归,必须用私有字段存储实际值,不能直接访问属性本身。
二、输入只能是字符串时的处理方案
如果你的输入只能是字符串(比如从数据库读取的内容),可以用以下两种方式处理:
方案1:新增专门处理字符串的方法
给类添加一个方法,专门接收字符串并完成转换,同时处理转换失败的情况:
public class Parameter { // 私有字段存储实际的数值 private double? _lowBound; // 对外暴露的数值属性 public double? LowBound { get { return _lowBound; } set { _lowBound = value; } } // 新增方法:接收字符串并转换为double? public void SetLowBoundFromString(string strValue) { // 用TryParse避免转换失败抛出异常 if (double.TryParse(strValue, out double result)) { _lowBound = result; } else { // 转换失败时的处理逻辑,比如设为null _lowBound = null; // 也可以根据需求抛出异常: // throw new ArgumentException($"无法将字符串「{strValue}」转换为有效的数值"); } } }
使用时直接调用方法:
param.SetLowBoundFromString("从数据库获取的字符串");
方案2:新增字符串类型的属性
如果想保留赋值的语法,可以新增一个字符串属性,在它的set块里完成转换:
public class Parameter { private double? _lowBound; // 对外的数值属性,只允许读取或内部赋值 public double? LowBound { get { return _lowBound; } private set { _lowBound = value; } } // 专门接收字符串的属性 public string LowBoundString { set { if (double.TryParse(value, out double result)) { _lowBound = result; } else { _lowBound = null; } } } }
使用时直接赋值:
param.LowBoundString = "从数据库获取的字符串";
内容的提问来源于stack exchange,提问作者Michael Levin
相关产品推荐
相关产品推荐

