为什么这不编译?
int? number = true ? 5 : null;
Run Code Online (Sandbox Code Playgroud)
无法确定条件表达式的类型,因为'int'和<null>之间没有隐式转换
我有以下代码:
Func<string, bool> comparer = delegate(string value) {
return value != "0";
};
Run Code Online (Sandbox Code Playgroud)
但是,以下内容无法编译:
var comparer = delegate(string value) {
return value != "0";
};
Run Code Online (Sandbox Code Playgroud)
为什么编译器无法弄清楚它是Func<string, bool>什么?它需要一个字符串参数,并返回一个布尔值.相反,它给了我错误:
无法将匿名方法分配给隐式类型的局部变量.
我有一个猜测,那就是如果编译var版本,如果我有以下内容,它将缺乏一致性:
var comparer = delegate(string arg1, string arg2, string arg3, string arg4, string arg5) {
return false;
};
Run Code Online (Sandbox Code Playgroud)
上面没有意义,因为Func <>只允许最多4个参数(在.NET 3.5中,这就是我正在使用的).也许有人可以澄清这个问题.谢谢.
我对这个小C#quirk感到有点难过:
给定变量:
Boolean aBoolValue;
Byte aByteValue;
Run Code Online (Sandbox Code Playgroud)
以下编译:
if (aBoolValue)
aByteValue = 1;
else
aByteValue = 0;
Run Code Online (Sandbox Code Playgroud)
但这不会:
aByteValue = aBoolValue ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)
错误说:"不能隐式地将类型'int'转换为'byte'."
当然,这个怪物会编译:
aByteValue = aBoolValue ? (byte)1 : (byte)0;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
编辑:
使用VS2008,C#3.5
我正在重构一些代码.
现在有很多地方有这样的功能:
string error;
if (a) {
error = f1(a, long, parameter, list);
}
else {
error = f2(the_same, long, parameter, list);
}
Run Code Online (Sandbox Code Playgroud)
在重构f1和f2之前(虽然很大,但做类似的事情),我想重构为:
string error = (a ? f1 : f2)(a, long, parameter, list);
Run Code Online (Sandbox Code Playgroud)
就像在C中一样.(函数签名是相同的)
但是我收到一个错误:
"错误13无法确定条件表达式的类型,因为'方法组'和'方法组'之间没有隐式转换"
这将允许我通过初始重构给出不变行为来识别参数列表是相同的,并且还在单个位置重构调用,确保在这些各种重构期间所有内容都没有因为我将调用接口更改为方法而被破坏.
我错过了一些小的东西,它允许接近这个的语法工作(而不是一大堆额外的委托类型定义等)?
抱歉编辑,但实际上有一个返回值,是的,不幸的是,它是一个字符串.;-(
现在,我正在解决这个问题:
string error = a ? f1(a, long, parameter, list) : f2(a, long, parameter, list);
Run Code Online (Sandbox Code Playgroud)
问题是参数列表确实很长,并且会被重构,我宁愿先将它们合并,并在我更改时处理编译器错误.