C# resharper关于无法访问此代码的说法正确吗?

C# resharper关于无法访问此代码的说法正确吗?,c#,resharper,nullable,C#,Resharper,Nullable,整形器说,?的左侧永远不会为空,即使它的类型是int? _savedMediaFileId = mediaFile.MediaFileId ?? _savedMediaFileId; 自动重构“删除无法访问的代码”将其转化为: _savedMediaFileId = (int) mediaFile.MediaFileId; 这是对的还是Resharper在这里犯了错误 我的想法是从int开始?是可空的,那么我可以使用??在现有值为null的情况下保留该值 这是

整形器说,
的左侧永远不会为空,即使它的类型是
int?

        _savedMediaFileId = mediaFile.MediaFileId ?? _savedMediaFileId;
自动重构“删除无法访问的代码”将其转化为:

        _savedMediaFileId = (int) mediaFile.MediaFileId;
这是对的还是Resharper在这里犯了错误

我的想法是从int开始?是可空的,那么我可以使用??在现有值为null的情况下保留该值

这是我的单元测试(正在进行中)

[TestClass]
公共类MediaRepositoryTest
{
私有常量字符串SiteId=“3”;
私有常量字符串连接字符串=
@“数据源=dvmind\mssqlsites;数据库=************;用户名=sa;密码=**************”;
私有字符串_mediaSourceName=“TestMediaSourceName”;
私有字符串_mediaTypeName=“TestMediaTypeName”;
私有字符串_mediaSourceAddress=“TestMediaSourceAddress”;
私有字符串_mediaFileAddress=“TestMediaFileAddress”;
private intu savedMediaFileId=0;
私有字符串GetGuidString()
{
返回Convert.ToBase64String(Guid.NewGuid().ToByteArray());
}
[测试初始化]
public void TestInitialize()
{
_mediaSourceName=_mediaSourceName+GetGuidString();
_mediaTypeName=_mediaTypeName+GetGuidString();
_mediaSourceAddress=_mediaSourceAddress+GetGuidString();
_mediaFileAddress=_mediaFileAddress+GetGuidString();
}
[测试清理]
公共void TestCleanup()
{
使用(var db=newsitecontext(ConnectionString))
{
如果(_savedMediaFileId!=0)
{
(从db.MediaFiles中的c开始,其中c.MediaFileId==\u savedMediaFileId选择c)
.ForEach(c=>db.MediaFiles.Remove(c));
}
(从db.MediaSources中的c开始,其中c.MediaSourceName==_MediaSourceName选择c)
.ForEach(c=>db.MediaSources.Remove(c));
(从db.MediaTypes中的c开始,其中c.MediaTypeName==_MediaTypeName选择c)
.ForEach(c=>db.MediaTypes.Remove(c));
}
}
[测试方法]
public void SaveMediaTest()
{
var mediaSource=新的mediaSource
{
MediaSourceName=\u MediaSourceName,
MediaSourceAddress=\u MediaSourceAddress
};
var mediaType=新的mediaType
{
MediaTypeName=\u MediaTypeName
};
var mediaFile=新的mediaFile
{
SiteId=SiteId,
MediaFileAddress=\u MediaFileAddress,
MediaSource=MediaSource,
MediaType=MediaType
};
var连接字符串提供程序=
Mock.Of(c=>c.GetConnectionString()==ConnectionString);
var repository=新媒体存储库(connectionStringProvider);
Assert.IsTrue(mediaFile.MediaFileId==0);
SaveMedia(mediaFile);
Assert.IsTrue(mediaFile.MediaFileId!=0);
_savedMediaFileId=mediaFile.MediaFileId???\u savedMediaFileId;
//使用(var db=newsitecontext(ConnectionString))
//{  
//}
}

ReSharper可能在这里推断,
mediaFile.MediaFileId
永远不会有值
null
,即使类型是
int?
。因此建议您完全跳过
null
检查,直接查找值

下面是一个更清楚的例子

string s = "hello world";
if (s != null) { 
  ...
}

在这种情况下,
s
实际上可以是
null
,因为它是
string
类型,并且
null
是一个有效值。但是在这种特定的上下文中,
s
永远不能是
null
,因此ReSharper会将此检查标记为不必要的

ReSharper可能在这里推断
mediaFile.Med即使类型为
int?
,iaFileId
也不能有值
null
。因此建议您完全跳过
null
检查,直接查找值

下面是一个更清楚的例子

string s = "hello world";
if (s != null) { 
  ...
}

在这种情况下,
s
实际上可以是
null
,因为它是
string
类型,
null
是一个有效值。但是在这个特定的上下文中,
s
永远不能是
null
,因此ReSharper会将这个检查标记为不必要的这有点猜测,但我认为这里发生了什么(基于

当您声明someting int?时,它不会创建一个可以为null的引用类型。相反,它创建了
Nullable
,这是一个
struct
,意味着它不能为null。b/c它是一个值类型。除了值之外,该结构还包含一个布尔标志,告诉它是否为null或者值是否有效

因此,执行
int???
本质上是测试结构的空值,它永远不会是空值。它不测试
null。HasValue
是测试是否为“null”的一种方法


这是一个猜测,但我认为这里发生了什么(基于

当您声明someting int?时,它不会创建一个可以为null的引用类型。相反,它创建了
Nullable
,这是一个
struct
,意味着它不能为null。b/c它是一个值类型。除了值之外,该结构还包含一个布尔标志,告诉它是否为null或者值是否有效

因此,执行
int???
本质上是测试结构的空值,它永远不会是空值。它不测试
null。HasValue
是测试是否为“null”的一种方法


因此,ReSharper抱怨。

既然您已经发布了一个完整的示例,我认为您获得无法访问的代码的原因是由于这行前面的断言条件

Assert.IsTrue(mediaFile.MediaFileId == 0);
如果mediaFile.MediaFileId为null,则程序在此行退出;如果不是,则警告正确;突出显示的行上的mediaFile.MediaFileId不能为null

_savedMediaFileId = mediaFile.MediaFileId ?? _savedMediaFileId;
另外,如果
保存的定义
repository.SaveMedia(mediaFile);