在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?
请每个回答只回答一个特征。
在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?
请每个回答只回答一个特征。
当前回答
为什么c#的List<T>.AddRange()不让我添加T的子类型的元素?阀门列表< T > () ! 微软只需要多写一行代码:
public void AddRange<S>(
IEnumerable<S> collection
) where S : T
其他回答
C预处理器及其用法。特别是预处理器元编程和使用预处理器生成可移植代码——完全是胡扯。
在PowerShell中,你可以重命名变量:
> $a = "some value"
> $b = "a"
> $c = "d"
> Rename-Item variable:$b $c
> $d
some value
间接间接!PHP!
字面也有用:
> Rename-Item variable:d e
> $e
some value
在c#中,以下代码会生成编译器错误“无法从方法组转换为委托”。虽然背后的逻辑是合理的,但我还是觉得很奇怪。
control.BeginInvoke(delegate { DoSomething(); });
VBScript中的括号标识符
VBScript有所谓的方括号标识符,这些标识符定义在方括号中,如下所示:
[Foo]
实际上,它们非常方便,因为它们允许您以保留字命名变量和例程,调用第三方对象的方法,其名称是保留字,并且还可以在标识符中使用几乎任何Unicode字符(包括空格和特殊字符)。但这也意味着你可以和他们一起玩:
[2*2] = 5
[Здравствуй, мир!] = [Hello, world!]
[] = "Looks like my name is an empty string, isn't that cool?"
For[For[i=0]=[0]To[To[To[0]
[Next[To]([For[i=0])=[For[i=0]
Next
另一方面,括号标识符可能是一个陷阱,以防你在这样的语句中忘记引号:
If MyString = "[Something]" Then
因为If MyString = [Something] Then是一个完全合法的语法。(这就是为什么必须使用具有语法高亮显示功能的IDE !)
更多关于括号标识符的信息,请参阅Eric Lippert的博客:
VBScript琐事:括号标识符和保留字不兼容 VBScript测试答案,第六部分
在JavaScript中,方法的结果取决于所放置的样式花括号。这是K&R风格,其中括号放在方法签名之后和return语句之后:
var foo = function() {
return {
key: 'value'
};
}
foo() // returns an object here
现在,如果我将这段代码格式化为Allman风格,其中括号总是放在新行上,结果是不同的:
var foo = function()
{
return
{
key: 'value'
};
}
foo() // returns undefined here
如何来吗?在JavaScript中,如果您不自己做,语言会自动在每行末尾放置分号。所以在最后一个代码片段中真正发生的是这样的:
var foo = function()
{
return; // here's actually a semicolon, automatically set by JavaScript!
{
key: 'value'
};
}
因此,如果调用foo(),方法中的第一个语句将是一个返回语句,该语句将返回undefined,并且不会执行后面的其他语句。