今天对我来说是个伟大的日子。我从未想过我会在野外看到这样的东西!我之前只在编译器测试中见过它。
考虑以下程序片段:
F(G<A,B>(7));
在C# 1.0中,这意味着“使用两个参数调用方法F:
G<A
和
B>(7)
”。
但是C# 2.0添加了泛型。在C# 2.0中,这意味着“使用一个参数调用方法F。该参数是对泛型方法
G<A, B>
的调用,其具有一个参数7”。
这是一项重大变革。C#采用了一些启发式方法来确保符合此模式的旧程序继续工作,但不是所有程序都能如此。
C#正在解释你的程序。
Check(a < b, a > (flag ? c : b - 10));
作为一个带有一个参数的Check
调用:带有一个参数的通用方法a<b, a>
的调用。
对于您来说,解决方案很简单,就像您已经发现的那样:只需添加更多括号以分隔参数以用于Check
。
如果您想知道C#用于尝试区分何时泛型和何时不是的确切规则,则是:
如果符号序列可以解析为简单名称、成员访问或指针成员访问,这些都以类型参数列表结尾,则会检查紧跟在关闭>符号后面的符号。 如果它是以下之一:( ) ] } : ; , . ? == != | ^
,则类型参数列表将保留为简单名称、成员访问或指针成员访问的一部分,并且任何其他可能的符号序列解析将被放弃。否则,即使没有其他可能的符号序列解析,类型参数列表也不被视为简单名称、成员访问或指针成员访问的一部分。请注意,在解析命名空间或类型名称中的类型参数列表时,不应用这些规则。
必须实现此类规则使得C#稍微有点难以解析,相信我。
Check((a<b), a>(flag ? c : b - 10));
,但我不知道为什么,耸肩。编辑:同样,没有括号,>
和==
也可以正常工作:Check(a==b, a>(flag ? c : b - 10));
,Check(a > b, a > (flag ? c : b - 10));
。一定是某个与<
相关的运算符? - QuanticCheck(a<b,a>(flag?c:b-10));
函数 a 带有泛型参数<b,a>
。 - L.BCheck(a<b, a < (flag ? c : b - 10));
运行良好(将>
反转为<
,这样它就不再像一个通用方法了)。 - Quantic