【问题标题】:Why types cannot be compared straight forward (by "T1 == T2")?为什么不能直接比较类型(通过“T1 == T2”)?
【发布时间】:2017-01-20 08:53:57
【问题描述】:

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

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

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

,但不能直截了当:

if (T1 == T2)

为什么?

【问题讨论】:

  • @m.rogalski:据我所知,类型名称不是有效的表达式。因此,C# 的语法比运算符更重要。 (此外,还有哪些运算符?没有typeof,类型名称就不是System.Type。)
  • @m.rogalski:这个问题是关于比较类型的。他们在typeof 表达式中使用T1T2。我相当肯定他们试图暗示 T1T2 是类型名称,特别是考虑到以这种方式比较 System.Types 已经有效。
  • 我想该功能没有为climb out of the -100 hole 积累足够的积分。可能还有一些语法和解析问题需要考虑。
  • 除了 can 方面,你为什么想要这个?这看起来像一个 XY 问题。
  • IMO 这样做是非常不寻常的(并且可能与反模式有关),以至于想要通过强制使用 typeof() 来引起人们的注意

标签: c# types compare comparison typeof


【解决方案1】:

正如Joey 所提到的,由于 C# 的语法,类型名称,如 T1T2(或stringint 等)不能直接用作表达式语言。请参考以下语法规范: https://docs.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!");
}

编译器应该如何处理该代码 sn-p?添加或删除结构T1 会破坏函数Main 的行为,从而在重新编译时破坏二进制兼容性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 2018-10-25
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2014-08-26
    • 2019-12-07
    相关资源
    最近更新 更多