为什么类型不能直接比较(按"T1 == T2")?



我觉得,这是一个有点愚蠢的问题,但是...

我知道,这是规则,但不知道,为什么会这样。对于名为 T1T2 的 2 种类型,我可以:

if (typeof(T1) == typeof(T2))
...

,但不能直接做到:

if (T1 == T2)

为什么?

正如 Joey 所提到的,由于 C# 语言的语法,诸如 T1T2(或 stringint 等)等类型名称不能直接用作表达式。请参考以下语法规范: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的行为,从而在重新编译时破坏二进制兼容性。

相关内容

  • 没有找到相关文章

最新更新