我怎么看,这种类型直接等于null也会报错吧
一位使用Visual Studio 2017的码畜路过:
我这边没问题。
贴错图了,看最新的。。
@天降一道闪电: 你是自己动手写的吗,如果是的话你可以看看这个:https://www.jianshu.com/p/895cd89ccdbd
@默卿: 原来是隐式转换啊。赞
@会长: F12看C#自带的Nullable里面没有这个转换,可能是编译器对自家写的代码更亲切吧,哈哈
@默卿: 有可能吧,有空研究下,看看生成的IL代码就知道了应该
@默卿: 我知道要用隐式转型的方法,但是?只是c#的语法糖,书上说int?等价于Nullable<int>,而且c#自己的方法里用的不是T?
就算用了T?由于T?等价于nullable<T>不是跟上边一样了吗
@天降一道闪电: 先说C#自己没用T?的问题,上面博客指出了,“这是因为编译器把【我们定义的】结构体XfhNullable<T>看作是普通值类型而非可空值类型,所以我们还要添加可空值类型和XfhNullable<T>之间的转换功能。”,我推测是它自己定义的结构体编译器能通过,不需要做隐式转换,而我们手写的要自己转,就类似于人家内置了这一步操作,当然只是我猜的,技术能力有限无法给你证实。再说用T?,你仔细看你写的用implicit关键字修饰的方法,参数是T,不是T?。然后我自己本地改成T?以后是可以的,像这样:
@默卿: 我是说,就算我像你上面那样写,然而T?只是Nullable<T>的语法糖,你这样不相当于把null传给了隐式转型的方法参数,还相当于 Nullable<T> nullableValue = null 这样。是不是又回到了最初的问题
@默卿:
IL代码里没有提跟null的联系,只是把值类型初始化了
这样写的IL代码跟上边的写法一模一样
自己想想逻辑,用于补充描述 一个原本值类型(不能为null)的类型,你还把他null,那么这种设计有什么意义,p还有什么意义
可是c#自己的Nullable就可以是个null,这是为啥呢
所以微软把这个类型设计成struct,让你在技术层面也没有异议~~
如果对struct和class分不清楚,自己去试试代码。
@花飘水流兮:
试过了 报错
@天降一道闪电: null是补充描述 int 的,并不是对Nullable<>——因为Nullable<>是struct;他这个实现不清楚是翻译时做的还是其他时候处理的。
没看清你的写法,反正本地2019、2017测试Nullable<int> a= null是可以的 ——
确实一般不这么费事来写,更习惯?简写。如果你不是VS,且报错,那么我们可以认为这个特殊问题处理在编辑时。
@花飘水流兮: 我是看clr via c#这本书里边,说可空值类型的设计源码是我上边写的那样的。但是我敲了一遍,发现并不能直接等于null。
@天降一道闪电: 我重新看到了问题——“
为什么我觉得书上说的的可空值类型的设计代码并不能让它等于null
”,这句话是很正确的,都是struct,再次强调一下那样写只是描述,跟classA=null不是一回事。
关于为什么很正确,你自己测试struct和class,了解堆栈。继续深入,可以从c去了解静态分配和动态分配。
https://img2018.cnblogs.com/blog/1002907/201909/1002907-20190919112231146-1349173934.png
我的vs2015 表示也是没有什么问题
贴错图了。。