首页 新闻 会员 周边

为什么我觉得书上说的的可空值类型的设计代码并不能让它等于null

0
悬赏园豆:100 [已解决问题] 解决于 2019-09-23 09:44

我怎么看,这种类型直接等于null也会报错吧

天降一道闪电的主页 天降一道闪电 | 初学一级 | 园豆:104
提问于:2019-09-19 11:11
< >
分享
最佳答案
0

一位使用Visual Studio 2017的码畜路过:

我这边没问题。

收获园豆:50
顾星河 | 大侠五级 |园豆:7173 | 2019-09-19 11:18

贴错图了,看最新的。。

天降一道闪电 | 园豆:104 (初学一级) | 2019-09-19 11:24

@天降一道闪电: 你是自己动手写的吗,如果是的话你可以看看这个:https://www.jianshu.com/p/895cd89ccdbd

顾星河 | 园豆:7173 (大侠五级) | 2019-09-19 11:33

@默卿: 原来是隐式转换啊。赞

会长 | 园豆:12401 (专家六级) | 2019-09-19 11:39

@会长: F12看C#自带的Nullable里面没有这个转换,可能是编译器对自家写的代码更亲切吧,哈哈

顾星河 | 园豆:7173 (大侠五级) | 2019-09-19 11:44

@默卿: 有可能吧,有空研究下,看看生成的IL代码就知道了应该

会长 | 园豆:12401 (专家六级) | 2019-09-19 11:53

@默卿: 我知道要用隐式转型的方法,但是?只是c#的语法糖,书上说int?等价于Nullable<int>,而且c#自己的方法里用的不是T?

就算用了T?由于T?等价于nullable<T>不是跟上边一样了吗

天降一道闪电 | 园豆:104 (初学一级) | 2019-09-19 11:59

@天降一道闪电: 先说C#自己没用T?的问题,上面博客指出了,“这是因为编译器把【我们定义的】结构体XfhNullable<T>看作是普通值类型而非可空值类型,所以我们还要添加可空值类型和XfhNullable<T>之间的转换功能。”,我推测是它自己定义的结构体编译器能通过,不需要做隐式转换,而我们手写的要自己转,就类似于人家内置了这一步操作,当然只是我猜的,技术能力有限无法给你证实。再说用T?,你仔细看你写的用implicit关键字修饰的方法,参数是T,不是T?。然后我自己本地改成T?以后是可以的,像这样:

顾星河 | 园豆:7173 (大侠五级) | 2019-09-19 14:26

@默卿: 我是说,就算我像你上面那样写,然而T?只是Nullable<T>的语法糖,你这样不相当于把null传给了隐式转型的方法参数,还相当于 Nullable<T> nullableValue = null 这样。是不是又回到了最初的问题

天降一道闪电 | 园豆:104 (初学一级) | 2019-09-19 14:56

@默卿:

IL代码里没有提跟null的联系,只是把值类型初始化了

天降一道闪电 | 园豆:104 (初学一级) | 2019-09-19 15:02


这样写的IL代码跟上边的写法一模一样

天降一道闪电 | 园豆:104 (初学一级) | 2019-09-19 15:05
其他回答(2)
0

 自己想想逻辑,用于补充描述 一个原本值类型(不能为null)的类型,你还把他null,那么这种设计有什么意义,p还有什么意义

收获园豆:50
花飘水流兮 | 园豆:13560 (专家六级) | 2019-09-19 11:16


可是c#自己的Nullable就可以是个null,这是为啥呢

支持(0) 反对(0) 天降一道闪电 | 园豆:104 (初学一级) | 2019-09-19 11:20

 所以微软把这个类型设计成struct,让你在技术层面也没有异议~~

如果对struct和class分不清楚,自己去试试代码。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2019-09-19 11:20

@花飘水流兮:
试过了 报错

支持(0) 反对(0) 天降一道闪电 | 园豆:104 (初学一级) | 2019-09-19 11:21

@天降一道闪电: null是补充描述 int 的,并不是对Nullable<>——因为Nullable<>是struct;他这个实现不清楚是翻译时做的还是其他时候处理的。

没看清你的写法,反正本地2019、2017测试Nullable<int> a= null是可以的 —— 

确实一般不这么费事来写,更习惯?简写。如果你不是VS,且报错,那么我们可以认为这个特殊问题处理在编辑时。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2019-09-19 11:28

@花飘水流兮: 我是看clr via c#这本书里边,说可空值类型的设计源码是我上边写的那样的。但是我敲了一遍,发现并不能直接等于null。

支持(0) 反对(0) 天降一道闪电 | 园豆:104 (初学一级) | 2019-09-19 11:32

@天降一道闪电: 我重新看到了问题——“

为什么我觉得书上说的的可空值类型的设计代码并不能让它等于null

”,这句话是很正确的,都是struct,再次强调一下那样写只是描述,跟classA=null不是一回事。

关于为什么很正确,你自己测试struct和class,了解堆栈。继续深入,可以从c去了解静态分配和动态分配。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2019-09-19 11:43
0
雷。 | 园豆:775 (小虾三级) | 2019-09-19 11:23

贴错图了。。

支持(0) 反对(0) 天降一道闪电 | 园豆:104 (初学一级) | 2019-09-19 11:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册