相关疑难解决方法(0)

在 C# 8.0 中调用方法之前感叹号是什么意思?

我发现了一段用 C# 编写的代码,貌似是 8.0 版。在代码中,在调用方法之前有一个感叹号。这部分代码是什么意思,最重要的是,它的用途是什么?

var foo = Entity!.DoSomething();
Run Code Online (Sandbox Code Playgroud)

c# null nullable c#-8.0

58
推荐指数
3
解决办法
2万
查看次数

什么是null!声明的意思?

我最近看到了以下代码:

public class Person
{
    //line 1
    public string FirstName { get; }
    //line 2
    public string LastName { get; } = null!;
    //assign null is possible
    public string? MiddleName {get; } = null;

    public Person(string firstName, string lastName, string middleName)
    {
        FirstName = firstName;
        LastName = lastName;
        MiddleName = middleName;
    }

    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
        MiddleName = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上我试着深入研究新的c#8功能.其中之一是NullableReferenceTypes.实际上已经有很多关于它的文章和信息.例如,这篇文章非常好.但是我找不到关于这个新陈述的任何信息null! 有人可以向我提供解释吗?为什么我需要使用它?又什么区别line1line2

c# c#-8.0 nullable-reference-types

56
推荐指数
3
解决办法
2836
查看次数

C# 参数名后面的感叹号是什么

这是我在这里的第一个问题。我在 C# 中遇到了这样的方法:

void Do(string action!) { ... }
Run Code Online (Sandbox Code Playgroud)

不要明白!后面action是什么,它确实如此。你能帮我理解一下吗?

c# c#-9.0

8
推荐指数
1
解决办法
2438
查看次数

我们可以在 C# 8.0 中避免使用不可为空的方法参数的空参数保护子句吗?

在 C# 8.0 中,假设我<Nullable>enable</Nullable>在 .csproj 中启用了可空引用。当我尝试在不可为空的用法中使用可能为空的引用时,这给了我警告,这很好。然后我可以打开<WarningsAsErrors />并将其严格执行为错误而不是警告。

所以我希望这种语言结构可以避免某些空检查代码。具体来说,我(和许多其他人)经常写这样的方法:

public string Message { get; set; }
public void SetFoo(string message) {
   Message = message ?? throw new ArgumentNullException(nameof(message)); 
   Console.WriteLine(Message.ToUpper())
}
Run Code Online (Sandbox Code Playgroud)

我希望放弃空检查,因为引用是不可为空的,而是写

public string Message { get; set; }
public void SetFoo(string message) {
   Message = message; 
   Console.WriteLine(Message.ToUpper())
}
Run Code Online (Sandbox Code Playgroud)

这似乎很好,因为像这样的调用会myThing.SetFoo(null);生成编译器警告/错误。但是,我发现诸如myThing.SetFoo(null!);编译和运行之类的代码无论如何都可以!因此,为了进行防御性编码,无论如何我都需要保留旧的保护条款,以防有人滥用!运算符来调用它,对吗?

有什么方法可以避免编写代码来检查不可为空的引用是否为空? 我希望有一种方法可以让编译器推断它在这种情况下应该抛出异常,而不仅仅是忽略不可为空性,但我没有看到。

c# c#-8.0

5
推荐指数
1
解决办法
761
查看次数

标签 统计

c# ×4

c#-8.0 ×3

c#-9.0 ×1

null ×1

nullable ×1

nullable-reference-types ×1