認為這是一個通用與特定型別的問題。我想將一個單位添加到可以是 anint或 a的字串轉換引數中float。我嘗試了以下方法,但在轉換時出現問題,因為在編譯時型別未知。
namespace ConsoleApp17
{
class Program
{
static int myInt = 1;
static float myFloat = 2f;
static void Main(string[] args)
{
string myFloatStr = "1.3";
string myIntStr = "2";
Add<float>(myFloatStr, SetNewFloatValue);
Add<int>(myIntStr, SetNewIntValue);
Console.ReadLine();
}
public static void Add<T>(string str, Action<T> action)
{
T valueToSet = (T)Math.Round(double.Parse(str) 1, 0 , MidpointRounding.AwayFromZero); //problem here, cannot convert double to T
action(valueToSet);
}
private static void SetNewFloatValue(float floatArg) {
myFloat = floatArg;
}
private static void SetNewIntValue(int intArg)
{
myInt = intArg;
}
}
}
小提琴以防萬一。是對每個引數的方法多載這個唯一的解決辦法,還是有一個更優雅的解決方案,使得同一funtionality可以在兩種型別的一個同樣的方法來處理float和int?
意思是:
Add<float>(myFloatStr, SetNewFloatValue);
Add<int>(myIntStr, SetNewIntValue);
可以用一種相同的方法來完成。
uj5u.com熱心網友回復:
“通用數學”是你想要的。此功能是 .NET 6.0/C#10 中的預覽功能。這里有詳細描述。
這允許這樣的方法宣告:
public static TResult Sum<T, TResult>(IEnumerable<T> values)
where T : INumber<T>
where TResult : INumber<TResult>
{
TResult result = TResult.Zero;
foreach (var value in values)
{
result = TResult.Create(value);
}
return result;
}
該INumber介面是這一概念的魔力。它現在在大多數數字型別上實作。
以前,您必須手動實作(通過指定自己的INumber介面,使用 Add()、Subtract() 等方法)或使用dynamic型別在運行時評估正確的型別。前者為此撰寫了很多樣板,后者很慢。
uj5u.com熱心網友回復:
如果您使用的是比 .Net 6 更舊的版本,您可以Convert.ChangeType根據自己的情況使用。
T valueToSet = (T)Convert.ChangeType(Math.Round(double.Parse(str) 1, 0, MidpointRounding.AwayFromZero), typeof(T));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/408805.html
標籤:
上一篇:如何在JavaSpring中使用工廠設計模式初始化泛型型別?
下一篇:如何將物件及其子類作為物件的引數
