2

私はこのエラーにかなり混乱しています:

Cannot implicitly convert type 'System.Func<T,T,T> [c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll]' to 'System.Func<T,T,T> [c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll]' path\to\my\project\Operators.cs

タイプは同じですが、なぜキャストしようとしているのですか?コードは次のとおりです。

public static class Operators<T>
{
    private static Func<T,T,T> _add = null;

    public static T Add<T>(T a, T b)
    {
        if (_add == null) {
            var param1Expr = Expression.Parameter(typeof (T));
            var param2Expr = Expression.Parameter(typeof (T));
            var addExpr = Expression.Add(param1Expr, param2Expr);
            var expr = Expression.Lambda<Func<T, T, T>>(addExpr, param1Expr, param2Expr);
            _add = expr.Compile(); // <--- error occurs here
        }
        return _add.Invoke(a, b);
    }
}
4

2 に答える 2

13

問題は、メソッドがジェネリックであり、新しい型パラメーターを導入することTです。したがって、メソッドの外側はメソッドの内側Tと同じではありません。T

メソッドを一般的でないように変更するだけです。

public static T Add(T a, T b)

...そしてそれは大丈夫なはずです。

より明確にするために、あなたのコードは現在これと同等です:

public static class Operators<TC>
{
    private static Func<TC, TC, TC> _add = null;

    public static TM Add<TM>(TM a, TM b)
    {
        if (_add == null) {
            var param1Expr = Expression.Parameter(typeof(TM));
            var param2Expr = Expression.Parameter(typeof(TM));
            var addExpr = Expression.Add(param1Expr, param2Expr);
            var expr = Expression.Lambda<Func<TM, TM, TM>>
                          (addExpr, param1Expr, param2Expr);
            _add = expr.Compile();
        }
        return _add.Invoke(a, b);
    }
}

クラスTによって導入された名前をに、メソッドによって導入された名前をに変更したことに注意してください。エラーメッセージはより合理的に見えます:TCTTM

Test.cs(19,20): error CS0029: Cannot implicitly convert type
        'System.Func<TM,TM,TM>' to 'System.Func<TC,TC,TC>'
于 2013-02-24T19:52:53.000 に答える
2

クラスのTforとのtypeパラメータは異なるタイプであるため、タイプに互換性があるという保証はありません。Operators<T>TAdd

たとえば、次のことができます。

Operators<string>.Add<int>(1, 2);

コンパイラは、この影響に対して警告を発します。

タイプパラメータ「T」は、外部タイプ「演算子」のタイプパラメータと同じ名前です。

于 2013-02-24T19:53:00.673 に答える