如果我编写C#编译器会引发“类型参数错误”? instance1 [(2)

问题描述 投票:0回答:1

[当我意识到可能无法区分使用<运算符的表达式和类或方法的类型参数时,我正在创建自己的静态类型的语言。

主要原因是,像C#一样,不必在使用类之前就全部声明它们,因此,当在<之后解析标识符时,它可能是诸如valueA < valueB的表达式或者它可能是类型参数,例如valueA<valueB>

所以我想,也许有一个>结束符,则可以将其解析为类型参数,但是后来我想起了我想让我的语言具有运算符重载功能,因此valueA < valueB > (valueC)这样的表达式可能是完全有效的。

我决定尝试使用其他语言,但发现C#与我尝试创建的语言最相似,并且我可能已经破坏了它。

由于下面的类具有重载的foo < bar > (2)<运算符,因此以下代码中的>表达式应该是完全有效的表达式。

据我所知,该表达式应解析为(foo < bar) > (2),但我收到一条错误消息,指出"The variable 'foo' cannot be used with type arguments."为证明该表达式应该是有效的,我将<>翻转了符号,使表达式看起来像foo > bar < (2),并且该程序完全编译并打印出了您期望的MainClass+baz

在此特定示例中,编译器可能会发现这一点,因为它知道foo是一个变量,并且可以假定<表示一个表达式,但是如果foo是另一个类的静态成员,则将无法区分<表达式和类型参数。

using System;

class MainClass {
  public static void Main (string[] args) {

    baz foo = new baz();

    baz bar = new baz();

    // perfectly valid expression, results in error: The variable `foo' cannot be used with type arguments
    Console.WriteLine(foo < bar > (2));

  }

  class baz {
    public static baz operator<(baz l, baz r) {
      return l;
    }

    public static baz operator>(baz l, baz r) {
      return l;
    }

    public static baz operator<(baz l, int r) {
      return l;
    }

    public static baz operator>(baz l, int r) {
      return l;
    }

  }

  public String toString() {
    return "baz";
  }

}

我的问题是,如何在C#编译器和其他语言中解决此问题?

我看到一些选择:

  1. 在模棱两可的情况下报告错误
  2. 也许还有更多上下文可以用来解决这种歧义
  3. C#本质上已损坏,我们应该在将来的语言中为类型参数开发新的语法。如果是这样,它应该是什么样?

也许对此有某种标准,但是我认为接受这一点只是疏忽,我们至少应该选择选项1。

c# syntax compiler-errors
1个回答
0
投票

foo是局部变量,但是您尝试将其用作类类型名称...

© www.soinside.com 2019 - 2024. All rights reserved.