You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:23:11