泛型T的类型推理



我有以下代码:

public interface IVector<T>
{
static abstract int Length { get; }
ref T this[int index] { get; }
}
public static class VectorExtensions
{
public static TElement LengthSquared<TVector, TElement>(this TVector vector)
where TVector : IVector<TElement>
where TElement : INumberBase<TElement>
{
TElement lengthSquared = TElement.Zero;
for (int i = 0; i < TVector.Length; ++i)
{
lengthSquared += vector[i] * vector[i];
}
return lengthSquared;
}
public static TElement Length<TVector, TElement>(this TVector vector)
where TVector : IVector<TElement>
where TElement : INumberBase<TElement>, IRootFunctions<TElement>
{
return TElement.Sqrt(vector.LengthSquared());
}
}

不幸的是,在第二种方法中产生了以下错误:

方法'VectorExtensions.LengthSquared<TVector,TElement>无法从用法中推断出(TVector("。

有没有一种方法可以构造此代码,以便它可以推断TElement的类型?

AFAIK C#在多个泛型类型参数的类型推理方面总是有点困难,所以您需要显式指定它们:

return TElement.Sqrt(vector.LengthSquared<TVector, TElement>());

或者将TElement的第二个参数添加到LengthSquared:

public static TElement LengthSquared<TVector, TElement>(
this TVector vector, 
TElement _) // some parameter to infer type
where TVector : IVector<TElement>
where TElement : INumberBase<TElement>
{
TElement lengthSquared = TElement.Zero;
for (int i = 0; i < TVector.Length; ++i)
{
lengthSquared += vector[i] * vector[i];
}
return lengthSquared;
}
public static TElement Length<TVector, TElement>(this TVector vector)
where TVector : IVector<TElement>
where TElement : INumberBase<TElement>, IRootFunctions<TElement>
{
return TElement.Sqrt(vector.LengthSquared(TElement.Zero));
}

最新更新