我正在使用 .NET 4.8 并使用 Deconstructor 声明一条记录:
public record Product
{
public string Name { get; }
public int CategoryId { get; }
public Product(string name, int categoryId)
=> (Name, CategoryId) = (name, categoryId);
public void Deconstruct(out string name, out int categoryId)
=> (name, categoryId) = (Name, CategoryId);
}
Run Code Online (Sandbox Code Playgroud)
然后我使用以下已编译的代码,它工作正常:
var product = new Product("VideoGame", 1);
var (name, categoryId) = product;
string s = name;
int i = categoryId;
Run Code Online (Sandbox Code Playgroud)
虽然此代码不起作用,但会生成错误:
“错误 CS0029 无法将类型 'ConsoleApp4.Product' 隐式转换为 'System.Tuple<string, int>'”):
var product = new …Run Code Online (Sandbox Code Playgroud) 我正在阅读 C# 8 中称为可为空引用类型的新功能的描述。该描述讨论了所谓的 null-forgiving 运算符。描述中的示例谈到了引用类型实例的取消引用(我认为是这样):
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-forgiving
当您明确知道表达式不能为 null 但编译器无法识别时,您也可以使用 null-forgiving 运算符。在以下示例中,如果 IsValid 方法返回 true,则其参数不为 null,您可以安全地取消引用它:
Run Code Online (Sandbox Code Playgroud)public static void Main() { Person? p = Find("John"); if (IsValid(p)) { Console.WriteLine($"Found {p!.Name}"); } } public static bool IsValid(Person? person) { return person != null && !string.IsNullOrEmpty(person.Name); }如果没有空值原谅运算符,编译器会为 p.Name 代码生成以下警告:警告 CS8602:取消引用可能为空值的引用。
我的印象是,在 C# 中取消引用对象意味着将其设置为 null。但看起来 Microsoft 将访问对象的属性称为取消引用该对象。
问题是:当我们谈论引用类型实例而不是托管和非托管指针时,C# 中的解引用术语是什么意思。
目前尚不清楚 中的身份转换到底是什么C#。微软说:
身份转换 身份转换可以从任何类型转换为相同类型。这种转换的存在使得已经具有所需类型的实体可以说可以转换为该类型。
因为对象和动态被认为是等效的,所以对象和动态之间以及用对象替换所有出现的动态时相同的构造类型之间存在身份转换。
很高兴看到 C# 中使用某些自定义类型进行此类转换的一些示例,以了解它到底是什么、它的局限性以及与其他类型的转换相比的优点。
我.NET在.NET Core控制台应用程序中使用5 。以下代码无法编译:
public class NullableClass<T?>
{
}
Run Code Online (Sandbox Code Playgroud)
错误是:
错误 CS1003 语法错误,“,”预期。
我是否使用任何约束都没有关系。
但这段代码编译:
[return: MaybeNull]
public static T? Find<T>(IEnumerable<T?> sequence, Func<T?, bool> predicate)
{
foreach (var element in sequence) {
if (predicate(element)) return element;
}
return default(T?);
}
Run Code Online (Sandbox Code Playgroud)
当我声明Find<T?>我有同样的错误。
我在这里不明白什么?