由于 C# 8.0 可空參考型別是可能的。如果啟用它們,您必須附加 ? 到參考型別以使其可以為空。
我現在的問題是如何強制使用params關鍵字的方法引數不可為空。
例子:
#nullable enable
public void MyMethod(params int[] foo)
{
// foo can still be null
// How can I ensure that foo is not null at compile-time
}
MyMethod(null); // valid, but why?
另一個類似的問題是:為什么一開始params int[] foo甚至可以為空?我希望類似的東西params int[]? foo使它可以為空。但是對于引數,這似乎有所不同。
我試過了,NotNullAttribute但這只會發出警告。我想完全禁止編譯器。
有沒有人知道一種使它不可為空的方法,也許可以告訴我為什么params即使使用 也允許為空#nullable enable?
uj5u.com熱心網友回復:
這也將有效
MyMethod();
它與可空值無關。您在這里以錯誤的方式使用了 nullable。這是因為您正在使用 params 關鍵字。
來自 MSDN
“使用 params 關鍵字,您可以指定一個方法引數,該引數采用可變數量的引數。引數型別必須是一維陣列。
呼叫帶有params引數的方法時,可以傳入:
....
沒有爭論。如果不發送任何引數,則 params 串列的長度為零。”
當您傳遞 null 時,您是在顯式地將 null 分配給引數。
但是如果你想使用可空和編譯器磨損,讓你的代碼像這樣
#nullable enable
public void MyAnotherMethod()
{
MyMethod(null); // Compiller will issue a warning
MyMethod(); // No warning
}
uj5u.com熱心網友回復:
- 有效,但為什么呢?
引數陣列在可空參考型別之前引入,并且從檔案中可以有效地null作為此類引數的值傳遞:
然后,呼叫者可以通過以下四種方式之一呼叫該方法:
- 通過傳遞包含所需元素數量的適當型別的陣列。
- 通過將適當型別的各個引數的逗號分隔串列傳遞給方法。
- 路過
null。- 通過不向引數陣列提供引數。
- 有沒有人知道一種使它不可為空的方法,也許可以告訴我為什么即使啟用了#nullable params 也允許為空?
如果呼叫是在啟用可空的背景關系中進行的,編譯器 應該發出警告。您可以通過更改編譯器設定來更改此警告。看到這個問題。
uj5u.com熱心網友回復:
參考有關Nullable 參考型別的 MSDN
已知的陷阱
包含參考型別的陣列和結構是可空參考和確定空安全性的靜態分析中的已知陷阱。在這兩種情況下,不可為空的參考都可以初始化為空值,而不會產生警告。
所以你不能讓這些型別不可為空,因為params是基于陣列的。
可能的解決方案是創建您自己的不可空型別或傳遞現有型別(例如,它實作了 IEnumerable)。我認為您應該達到與 params 相同的效果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/359805.html
