我觉得,这是一个有点愚蠢的问题,但是...
我知道,这是规则,但不知道,为什么会这样。对于名为 T1
和 T2
的 2 种类型,我可以:
if (typeof(T1) == typeof(T2))
...
,但不能直接做到:
if (T1 == T2)
为什么?
正如 Joey 所提到的,由于 C# 语言的语法,诸如 T1
、T2
(或 string
、int
等)等类型名称不能直接用作表达式。请参考以下语法规范:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure
因此,表达式 T1 == T2
与以下内容一样无效(从编译器的角度来看):
if (string == int) // <-- what does that even mean? Shouldn't that always be false?
Console.WriteLine("Hooray!");
由于类型名称没有任何附加的变量类型,因此必须使用 typeof(...)
语法从运行时获取类型表示形式(实际上,该语法返回类型为 System.Type
的值)。
允许 T1 == T2
时可能遇到的另一个问题是:
struct t1 { }
void Main<T1, T2>()
{
Type t1 = typeof(T1); // so far, so good.
if (t1 == T2) // wait, I'm the compiler and I am confused right now.
// Is t1 a type or a variable of the type 'System.Type'?
Console.WriteLine("Hooray!");
}
编译器应该如何利用该代码片段?添加或删除结构T1
会破坏函数Main
的行为,从而在重新编译时破坏二进制兼容性。