无法从'System.Linq.Expressions.Expression <System.Func <T,V?>>'转换为'System.Linq.Expressions.Expression <System.Func <T,十进制>>'

时间:2019-12-17 18:53:22

标签: c# generics roslyn iqueryable

为什么以下代码不能编译?

using System;
using System.Linq;
using System.Linq.Expressions;

public static class Extensions
{
    public static V? SumOrDefault<T, V>(this IQueryable<T> @this, Expression<Func<T, V>> selector)
        where V : struct, IComparable, IComparable<V>, IConvertible, IEquatable<V>, IFormattable
    {
        Expression<Func<T, V?>> nullableSelector = null; // omitted for brevity
        return Queryable.Sum<T>(@this, nullableSelector);
    }
}

出现此错误:

error CS1503: Argument 2: cannot convert from 'System.Linq.Expressions.Expression<System.Func<T, V?>>' to 'System.Linq.Expressions.Expression<System.Func<T, decimal>>'

两个问题:

  • 为什么会尝试调用失败的decimal版本的Sum<>
  • 为什么在decimal?中找不到该函数的System.Linq.Queryable版本?
        public static decimal? Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, decimal?>> selector);

1 个答案:

答案 0 :(得分:2)

从技术上讲,如果这行得通,您可以使用小数点无法转换但仍然尊重您的SumOrDefault where 自定义“例如,“ unsumumable”类)。

并且由于找不到安全地转换为哪种类型,因此无法找到函数的string版本。

C#无法将类型过滤为仅数字形式的AFAIK,因此您必须像2001年一样手动重载它们:

decimal?