`CallerArgumentExpression` 始终为 null (C# 10)
`CallerArgumentExpression` is always null (C# 10)
我正在尝试使用 CallerArgumentExpression
attribute, in conjunction with the suggestion for validating records ,但表达式始终为空。我在 .NET6 Core 控制台应用程序中执行此操作。完全相同的代码在 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;
}
}
然后我可以创建一个 record
如下...
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);
}
如果我尝试创建一个带有空 State
的 Address
...
Address a = new("5 My Street", "Somewhere", "", "Oz", "12345");
...然后抛出异常,但是expr
变量为空。正如我所说,完全相同的代码在 LinqPad 中运行良好,即使两者都使用相同版本的 .NET/C#.
谁能解释一下控制台应用程序出了什么问题?谢谢
Visual Studio 2019 不支持 C# 10。确保您使用的是 Visual Studio 2022。LinqPad 7 支持,这就是它在那里工作的原因。
我正在尝试使用 CallerArgumentExpression
attribute, in conjunction with the suggestion for validating records
我有一个包含常用验证方法的基础 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;
}
}
然后我可以创建一个 record
如下...
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);
}
如果我尝试创建一个带有空 State
的 Address
...
Address a = new("5 My Street", "Somewhere", "", "Oz", "12345");
...然后抛出异常,但是expr
变量为空。正如我所说,完全相同的代码在 LinqPad 中运行良好,即使两者都使用相同版本的 .NET/C#.
谁能解释一下控制台应用程序出了什么问题?谢谢
Visual Studio 2019 不支持 C# 10。确保您使用的是 Visual Studio 2022。LinqPad 7 支持,这就是它在那里工作的原因。