通用方法:无法从元组转换为T

时间:2018-10-01 06:16:22

标签: c# .net

我有一个通用方法:

public T Search<T>(entry entry)
{
    return (T)new Tuple<decimal, decimal>(entry.from, entry.to);

    return default(T);
}

我有逻辑根据传入的T的值返回不同的结果,但是编译器不允许我这样做,而是出现以下错误:"Cannot convert from Tuple to T"

如何解决此问题?

2 个答案:

答案 0 :(得分:5)

我怀疑您的实际代码在类型T上使用分支,然后有条件地尝试返回应该兼容的内容。

编译器无法跟踪内部逻辑,就其而言,T在尝试进行转换时可能仍然是任何内容。您可以通过第二次施力来强迫它的手:

public T Search<T>(entry entry)
{
    return (T)(object)new Tuple<decimal, decimal>(entry.from, entry.to);

    return default(T);
}

但是您最好具有正确的键入逻辑,否则将引发运行时错误。我个人不喜欢“谎言”的通用方法,因为它们将允许某些东西使用特定的类型参数进行编译,但由于类型不兼容而在运行时会崩溃。相反,我希望实现多个 related 方法,在这些方法中,您可以将类型绑定到您只能处理的类型。

答案 1 :(得分:0)

要完成以下工作,您需要T成为Tuple的基类

(T)new Tuple<decimal, decimal>(entry.from, entry.to);

元组是一个静态类,不能从系统名称空间下的任何内容派生。

因此,如果要处理两个属性上的数据,请使用这些属性创建一个新类,并从T派生它。

或者,返回类型取为

Tuple<decimal, decimal>