簡體   English   中英

Generics 的 C#/修復運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM