com*_*cme 14 c# resharper implicit null-coalescing-operator
我希望接下来的三行代码是相同的:
public static void TestVarCoalescing(DateTime? nullableDateTime)
{
var dateTimeNullable1 = nullableDateTime.HasValue ? nullableDateTime : DateTime.Now;
var dateTimeNullable2 = nullableDateTime != null ? nullableDateTime : DateTime.Now;
var dateTimeWhatType = nullableDateTime ?? DateTime.Now;
}
Run Code Online (Sandbox Code Playgroud)
在所有情况下,我都分配nullableDateTime
给新变量.我希望所有变量的类型都成为,DateTime?
因为那是类型nullableDateTime
.但令我惊讶的是,这种类型dateTimeWhatType
只是变成了DateTime
,所以不可空.
更糟糕的是,ReSharper建议用空合并表达式替换第二个语句,将其转换为表达式3.因此,如果我让ReSharper执行它的操作,变量的类型将从更改DateTime?
为DateTime
.
事实上,让我们说在方法的其余部分,我会使用
if (someCondition) dateTimeNullable2 = null;
Run Code Online (Sandbox Code Playgroud)
那会编译得很好,直到我让ReSharper用空合并版本替换第二个表达式.
AFAIK,取代
somevar != null ? somevar : somedefault;
Run Code Online (Sandbox Code Playgroud)
同
somevar ?? somedefault;
Run Code Online (Sandbox Code Playgroud)
应该确实产生相同的结果.但是对于可空类型的隐式类型,编译器似乎威胁??
就像它意味着一样.
somevar != null ? somevar.Value : somedefault;
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是为什么隐藏类型在我使用时会被更改??
,而且在文档中我可以找到关于此的信息.
顺便说一句,这不是一个现实世界的场景,但我想知道为什么使用??
更改(隐式)类型.
你的前两个例子让你误入歧途; 更好的是不要考虑你的
var dateTimeNullable1 = nullableDateTime.HasValue
? nullableDateTime
: DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
反而
var dateTimeNullable1 = nullableDateTime.HasValue
? nullableDateTime.Value
: DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
引用C#3.0规范的第7.12节"空合并运算符"(略微粗略格式化的道歉):
表达式的类型
a ?? b
取决于操作数类型之间可用的隐式转换.按优先顺序的类型,a ?? b
是A
0
,A
,或B
,其中A
是的类型a
,B
是的类型b
(其中,b
有一个类型)和A
0
为基础类型的A
,如果A
是空类型,或A
以其他方式.
因此,如果a
是Nullable<Something>
,并且b
可以隐式转换为Something
,则整个表达式的类型将是Something
.作为@Damien_The_Unbeliever所暗示的,点这个操作符的是凝聚空!
一时间去找所有语言律师.从C#规范(版本4):
7.13
表达式的类型
a ?? b
取决于操作数上可用的隐式转换.按优先顺序排列,所述类型的a ?? b
ISA0
,A
或B
,其中A
是的式a
(前提是a
具有类型),B
是的类型b
(其中,b
有一个类型)和A0
为基础类型的A
,如果A
是空类型,或者A
其他.
因此,??
如果第一个表达式是可空类型,则明确定义为首选表达式的基础类型.
而从语言7.14(处理?:
)只讨论实际类型x
,并y
从形式b ? x : y
,并讨论了隐式这两种类型之间的转换.
如果从X到Y存在隐式转换(第6.1节),而不是从Y到X,则Y是条件表达式的类型
由于Nullable(T)
定义了一个隐式从转换T
到Nullable(T)
的,只有一个显式的从转换Nullable(T)
到T
,唯一可能的类型的整体表达的是Nullable(T)
.
归档时间: |
|
查看次数: |
5875 次 |
最近记录: |