下面的擴展方法回傳一個復數形式的sonly whenvalue不等于 1。
public static string Pluralize<T>(this string s, T value) where T : struct, IComparable
{
return (value.CompareTo(1) == 0) ? s : s.Pluralize();
}
當 value 為 type 時,此方法可以正常作業int。但如果它是 a long、 adouble或幾乎任何其他型別,則會引發例外。
System.ArgumentException: '物件必須是 Double 型別。'
有誰知道與value1 進行比較的通用方法,即使T不是int?
否則,我將為每個支持的型別創建一個多載。
uj5u.com熱心網友回復:
使用泛型時,您放棄了使用值的大部分能力。通用約束回饋了其中的一部分,但不幸的是,仍然沒有辦法將型別約束為整數數字型別,即使現在許多 c# 版本已經討論過這一點。
如果您可以保證僅使用可轉換為整數的型別呼叫該方法,您可以使用Convert.ToInt32(value)它來轉換它,從而允許比較結果。但是對于非數字型別,這將在運行時失敗。
您還可以對要處理的每種型別使用型別檢查:
switch (value)
{
case float fValue:
return fValue == 1f ? s : s.Pluralize();
...
default:
return "fail";
}
這將是更多代碼,但可以讓您處理默認情況而無需捕獲例外。
uj5u.com熱心網友回復:
您可以應用 2 種解決方案(如果您想冒險使用預覽功能,請使用 3 種解決方案)。
使用dynamic:
dynamic v = value;
return v == 1 ? s : s.Pluralize();
由于可能的原語的數量是詳盡的,您也可以簡單地使用開關或模式匹配,如下所示:
return value switch
{
1 or 1L or 1UL or 1.0d or 1.0f or 1.0m => s, // covers int, long, ulong, double, float and decimal
uint x when x == 1 => s,
short x when x == 1 => s,
ushort x when x == 1 => s,
byte x when x == 1 => s,
sbyte x when x == 1 => s,
char x when x == 1 => s,
_ => s.Pluralize()
};
(不幸的是,uint、(u)short、(s)byte 和 char 沒有文字表示......)
但是,C#/.Net 路線圖上還有新的“通用數學”功能,您可以利用它。不幸的是,它沒有在 .NET 6 中脫穎而出,但您已經可以嘗試了(預覽版)。這將允許您按如下方式實作通用功能:
static string Pluralize<T>(this string s, INumber<T> value) where T : INumber<T>
=> value.Equals(T.One) ? s : s.Pluralize();
要完成這項作業,您需要將其添加到您的 csproj 檔案中:
<PropertyGroup>
<LangVersion>preview</LangVersion>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Runtime.Experimental" Version="6.0.2-mauipre.1.22054.8" />
</ItemGroup>
uj5u.com熱心網友回復:
您可以將通用約束設定為 IComparable、IComparable、IEquatable 并比較兩個通用值。這些值可以是類或結構,因為它實作了介面。Int、String、Guid,一切正常。
public bool CompareGenericValues<T>(T value1, T value2)
where T : IComparable, IComparable<T>, IEquatable<T>
{
return value1.Equals(value2);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/426693.html
上一篇:在簽名中注釋特定的資料類子類
下一篇:將通用動作存盤在字典中
