c# - 具有不同类型操作数的空合并运算符
问题描述
我知道您不能将不同的类型复合成一个结果,但我不明白为什么会这样。
例如。
Guid? ID;
int ID2;
var ID3 = ID ?? ID2;
无论、 var 、 object 等的可空性ID
或类型如何,上述代码都不起作用。ID3
谁能解释为什么不允许这样做?
我的实际代码如下所示:
public StandAloneMachine Get(int id, Guid? FKGuid = null, string FKName = "")
{
var parameters = new Parameters()
{
new Parameter("id", FKGuid ?? id)
};
}
解决方案
有没有人有理由不允许这样做?
这就是语言的设计方式。它应该怎么做?您如何将int
32 位数字转换GUID
为由多个数字部分组成的结构,反之亦然?
这段代码:
var ID3 = ID ?? ID2
翻译成类型意味着(伪代码):
(inferred type_) = Guid? ?? int;
并且??
运算符自然要求其参数的类型兼容。实际规则相当复杂,可以在此处的 C# 语言规范中找到。
无论如何,null-coalescing 运算符返回单个值,并且它的左右参数都必须计算为相同类型的值。因此,结果可能是a或a 。那么将是这种类型。但是,不能将和操作数的值转换为这种单一类型的值。Guid
int
(inferred type)
??
Guid
int
注意:您可能会争辩说编译器可以选择object
与两者兼容的关闭类型Guid
,int
并且只需将这些值装箱到一个对象中。但是,这会破坏强类型检查的意义。只是“太放松了”。
在您的特定示例中,坚持??
似乎是人为的;在你的代码中,一个好的旧的?:
和更多的表现力会做得更好,甚至可能有助于提高可读性:
var parameters = new Parameters()
{
new Parameter("id", FKGuid.HasValue ? ToTypeParameterExpects(FKGuid.Value) : ToTypeParameterExpects(id))
};
显然,是对' 的构造函数期望值的ToTypeParameterExpects
任何类型的转换。Parameter
推荐阅读
- ios - 如何禁用删除和移动 UICollectionView 中的第一个单元格?
- powerbi - 401 - 数据集刷新 PowerBI 期间出现未经授权的错误
- python - 为什么 tensorflow 会自动继续训练模型?
- javascript - 如何在加载包含 Firebase 的脚本的 Iframe 中使用 Firebase JS SDK?
- ios - 播放音频的后台功能有时仅在设备上有效,在模拟器 swift 4 上一直有效
- r - using purrr to extract elements from multiple lists starting with a common letter
- python - 如何使用python csv先写标题再写内容?
- javascript - JQuery - 搜索字符串的某些部分并在该字符串上使用 replaceWith
- swift - 在 Swift 中成功登录后如何最好地管理当前登录的用户?
- wordpress - EC2 Bitnami Wordpress 调试日志未显示在 wp-content 中