代码之家  ›  专栏  ›  技术社区  ›  Avrohom Yisroel

`CallerArgumentExpression`始终为空(C#10)

c#
  •  0
  • Avrohom Yisroel  · 技术社区  · 4 年前

    我在试着使用 CallerArgumentExpression attribute ,与建议一起验证记录 found here ,但表达式始终为空。我是在一个特殊的环境中做这件事的。NET6核心控制台应用程序。同样的代码在LinqPad 7(.NET6)中也可以正常工作。

    我有一个基地 record 其中包含常见的验证方法(基本上是从另一个答案复制而来)。。。

      public record CommonValidation {
        internal static bool NonEmptyOrNullString(string s, [CallerArgumentExpression("s")] string expr = default) {
          if (string.IsNullOrWhiteSpace(s)) {
            throw new ArgumentException($"{expr} cannot be null or empty");
          }
          return true;
        }
    
        internal static bool NonZeroInt(int n, [CallerArgumentExpression("n")] string expr = default) {
          if (n < 0) {
            throw new ArgumentException($"{expr} cannot be negative");
          }
          return true;
        }
      }
    

    然后我可以创建一个 记录 如下。。。

      public record Address(string Street, string City, string State, string Country, string Postcode) : CommonValidation {
        private bool _ = NonEmptyOrNullString(Street)
                         && NonEmptyOrNullString(City)
                         && NonEmptyOrNullString(State)
                         && NonEmptyOrNullString(Country)
                         && NonEmptyOrNullString(Postcode);
      }
    

    如果我试图创造一个 Address 空空荡荡的 State ...

    Address a = new("5 My Street", "Somewhere", "", "Oz", "12345");
    

    ...然后抛出异常,但是 expr 变量为空。正如我所说,完全相同的代码在LinqPad中可以正常工作,尽管两者都使用相同版本的。NET/C#。

    有人能解释一下控制台应用程序出了什么问题吗?谢谢

    0 回复  |  直到 4 年前
        1
  •  4
  •   Dharman vijay    4 年前

    Visual Studio 2019不支持C#10。确保您使用的是Visual Studio 2022。LinqPad 7可以,这就是它在那里工作的原因。