[英]C#/Fixing Operators for Generics
我嘗試在 Generics 上應用運算符(例如,乘法)
public static List<TOutput> Conversion<TOutput>(List<TInput> input)
{
List<TOutput> outList = new List<TOutput>();
foreach(TInput tinput in input)
{
double dbl = tinput *tinput;
outList.Add(dbl);
}
return outList;
}
修復它的任何解決方法?
如果沒有反映出類型,就不可能。 有一些代碼可以作為MiscUtil的一部分提供 。
這現在可以在 C# 11 / .NET 7(或以上):
public static List<TOutput> Conversion<TInput, TOutput>(List<TInput> input)
where TInput : IMultiplyOperators<TInput, TInput, TOutput>
{
List<TOutput> outList = new List<TOutput>();
foreach (TInput tinput in input)
{
TOutput product = tinput * tinput;
outList.Add(product);
}
return outList;
}
編譯器不應允許您將double賦值為未知類型:
outList.Add(DBL);
盡管如此,您可能會嘗試將dbl分配給一種FluxCapacitor。 您的代碼正在嘗試完成兩個不兼容的事情:返回通用(未知)類型的列表,以及2)強制該類型為double。 這沒有意義,這就是你遇到困難的原因。 您可以使用反射(如Porges指出的優秀鏈接)動態解決這個問題,但您確實需要問自己:為什么要嘗試將浮點數分配給具有未知類型的類? 調用代碼可能要求List<bool>
的結果。 嘗試分配會有多大意義
double foo = 1.5;
bool bar = foo;
? 零。 您可以讓編譯器執行任何足夠的翻筋斗,但是您需要重新評估例程的目的,為什么要嘗試將特定數據類型放入通用數據類型,以及此例程是否需要返回通用列表。
“MiscUtil”答案(已被接受)將是我的第一選擇;-p
您也可以在調用者處考慮LINQ:
var prodList = originalList.Select(x=>x*x).ToList();
由於調用者知道類型(假設它本身不是通用的,這應該可行。
為了完整起見,這里的另一個選項(在4.0中)是dynamic
:
public static List<TOutput> Conversion<TOutput>(List<TInput> input)
{
List<TOutput> outList = new List<TOutput>();
foreach(TInput tinput in input)
{
TOutput square = (dynamic)tinput * (dynamic)tinput;
outList.Add(square);
}
return outList;
}
您可以使用緩存的lambda進行計算(和/或轉換)。
這不需要DLR或動態關鍵字,因此它在C#3.0中完全可用
static class Squarer<T>
{
private static readonly Func<T, T> _square;
static Squarer()
{
ParameterExpression x = Expression.Parameter(typeof(T), "x");
_square = Expression.Lambda<Func<T, T>>(
Expression.Multiply(x, x),
x).Compile();
}
public static T Square(T value)
{
return _square.Invoke(value);
}
}
Console.WriteLine(Squarer<double>.Square(1234.5678));
Console.WriteLine(Squarer<decimal>.Square(1234.5678m));
Console.WriteLine(Squarer<int>.Square(1234));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.