如果這會影響答案,我正在使用 C# 10 和 VS2022。
我正在嘗試撰寫一個類來包含具有各種約束的引數。基本型別不應為空,一些引數(如默認)也應為空,而其他一些引數需要為空(我會根據需要檢查它們是否為空)。我找不到在課堂上以任何方式混合型別的方法。
我原本以為我可以將 T 定義為 notnull 然后使用 T? 使用我想要可為空的任何屬性,而我可以定義類/函式,嘗試呼叫代碼無法編譯。
public class Parameter<T> where T : notnull {
public T Value { get; set;}
public T? Min { get; set; }
public void Set(T? value_)
{
}
}
Parameter<int> parameter = new();
parameter.Set(null);
如果我在類中通過 VS2022 檢查 Set,它會正確顯示 Set(T? value_) 作為引數,但如果我檢查 parameter.Set 它顯示 Set(int value),然后拒絕編譯上述用法:
Argument 1: cannot convert from int? to int
我考慮將可為空的屬性定義為 T2 并允許其為空,但后來我遇到了無法比較或分配 T 和 T2 的問題,這會破壞目的。
我在這里錯過了什么愚蠢的東西還是有另一種方法可以做到這一點?
uj5u.com熱心網友回復:
既然你在評論中說:
我所有的用法(如上所述)都是值型別(主要是 int、float、bool)
只需使用struct 通用約束:
where T : struct- 型別引數必須是不可為空的值型別。有關可空值型別的資訊,請參閱可空值型別。因為所有值型別都有一個可訪問的無引數建構式,所以struct約束意味著new()約束并且不能與new()約束結合。您不能將struct約束與unmanaged約束結合起來。
public class Parameter<T> where T : struct {
public T Value { get; set;}
public T? Min { get; set; }
public void Set(T? value_)
{
}
}
這將允許T?決議為有效的可空值型別parameter.Set(null);。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/487111.html
