Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有不同类型的空合并运算符_C# - Fatal编程技术网

C# 具有不同类型的空合并运算符

C# 具有不同类型的空合并运算符,c#,C#,我知道你不能将不同的类型组合成一个结果,尽管我不明白为什么会这样 例如 不管ID的可空性或ID3、var、object等的类型如何,上述代码都不起作用 有人有理由不允许这样做吗 我的实际代码如下所示: public StandAloneMachine Get(int id, Guid? FKGuid = null, string FKName = "") { var parameters = new Parameters() { new Parameter

我知道你不能将不同的类型组合成一个结果,尽管我不明白为什么会这样

例如

不管ID的可空性或ID3、var、object等的类型如何,上述代码都不起作用

有人有理由不允许这样做吗

我的实际代码如下所示:

public StandAloneMachine Get(int id, Guid? FKGuid = null, string FKName = "") 
{ 
    var parameters = new Parameters() 
    { 
        new Parameter("id", FKGuid ?? id) 
    }; 
}
有人有理由不允许这样做吗

这就是语言的设计方式。它应该做什么?如何将一个32位的int转换成一个GUID,GUID是由几个数字部分组成的结构,反之亦然

此代码:

var ID3 = ID ?? ID2
翻译成类型意味着伪代码:

那这个呢??运算符自然要求其参数的类型兼容。实际规则相当复杂,可以找到

无论如何,null合并运算符返回一个值,其左参数和右参数必须计算为同一类型的值。因此,结果可以是Guid,也可以是int。然后推断的类型将是此类型。但是呢???无法将Guid和int操作数的值转换为此类单一类型的值

注意:您可能会争辩说,编译器可以选择object作为与Guid和int兼容的关闭类型,并将这些值装箱到一个对象中。然而,这将破坏强类型检查的感觉。那就太“放松”了

在您的特定示例中,坚持??看起来很做作;一个好的老版本?:代码中稍微多一些表达能力会更好,甚至可能有助于可读性:

var parameters = new Parameters() 
{ 
    new Parameter("id", FKGuid.HasValue ? ToTypeParameterExpects(FKGuid.Value) : ToTypeParameterExpects(id)) 
}; 

显然,ToTypeParameterExpects是参数的构造函数期望值的任何类型的转换。

这就是语言的设计方式这似乎是事实看看你和Amy链接的规范谢谢你关于Note的更新注释不用于扩展讨论;这段对话已经结束。
(inferred type_) = Guid? ?? int;
var parameters = new Parameters() 
{ 
    new Parameter("id", FKGuid.HasValue ? ToTypeParameterExpects(FKGuid.Value) : ToTypeParameterExpects(id)) 
};