所以我遇到了今天的情况,其中一些生产代码正在失败,因为一个方法完全按照MSDN中的说明执行.因为没有阅读文档而感到羞耻.然而,我仍然在摸索为什么它会以这种方式行事,即使是"按设计",因为这种行为正好与我预期的(和其他已知行为)相反,因此似乎违反了原则最不惊讶的.
该All()方法允许您提供谓词(例如lambda表达式)来测试IQueryable,返回一个布尔值,指示所有集合成员是否与测试匹配.到现在为止还挺好.这就是它变得奇怪的地方. 如果集合为空,All()也会返回true.由于以下原因,这似乎完全落后于我:
Any()方法按预期行为,并且(正确)返回false,因为它没有任何与谓词匹配的成员.所以我的问题是,为什么All()这样做?它解决了什么问题?这是否违反了最不惊讶的原则?
我将此问题标记为.NET 3.5,但该行为也适用于.NET 4.0.
编辑 好的,所以我掌握了这个逻辑方面,正如杰森和你们其他人所做的那样.不可否认,空集合是一种边缘情况.我想我的问题根植于斗争,只是因为某些东西是合乎逻辑的并不意味着如果你没有处于正确的思维框架中,它必然是有道理的.
我正在做非常简单的int划分,我得到奇怪的结果.
此代码2按预期打印:
public static void main(String[] args) {
int i = 200;
int hundNum = i / 100;
System.out.println(hundNum);
}
Run Code Online (Sandbox Code Playgroud)
此代码打印1为不期望:
public static void main(String[] args) {
int i = 0200;
int hundNum = i / 100;
System.out.println(hundNum);
}
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
(Windows XP Pro,在Eclipse 3.4.1中运行的Java 1.6)
我的一个朋友带着这种我无法解释的奇怪行为来找我,任何洞察力的观点都会受到赞赏.
我正在运行VS 2005(C#2.0),以下代码显示了该行为
int rr = "test".IndexOf("");
Console.WriteLine(rr.ToString());
Run Code Online (Sandbox Code Playgroud)
上面的代码,打印"0",清楚地表明它应该返回-1
这也发生在Java中,下面的Class显示了这种行为:
public class Test{
public static void main(String[] args){
System.out.println("Result->"+("test".indexOf("")));
}
}
Run Code Online (Sandbox Code Playgroud)
我正在运行Java 1.6.0_17
以下简单的Java代码只使用该startsWith()方法.
package startwithdemo;
final public class Main
{
public static void main(String[] args)
{
System.out.println("My String".startsWith("M"));
System.out.println("My String".startsWith("My"));
System.out.println("My String".startsWith(""));
}
}
Run Code Online (Sandbox Code Playgroud)
它显示true在所有情况下.前两种情况很明显,但在最后一种情况下(使用空字符串),它正在返回true.怎么样?