c# - 用泛型对象初始化非泛型对象

标签 c# wcf generics constructor

有时我没有正确理解 C# 泛型的那些 T。我有一个通用结构

public struct ValueWithUnit<T>
{
    public ValueWithUnit(T _value, Unit _unit)
    {
        Unit = _unit;
        Value = _value;
    }
    public Unit Unit { get; }
    public T Value { get; }
}

(Unit 是一个enumT 应该是数字,但没有可用于该目的的约束)。

对于 WCF,我需要一个非泛型版本,Tdouble。所以我想到了:

public struct DoubleValueWithUnit 
{
    public DoubleValueWithUnit(double _value, Unit _unit)
    {
        Unit = _unit;
        Value = _value;
    }
    public DoubleValueWithUnit(ValueWithUnit<T> _valueWithUnit)
    {
        Unit = _valueWithUnit.Unit;
        Value = Convert.ToDouble(_valueWithUnit.Value);
    }
    public Unit Unit { get; set; }
    public double Value { get; set; }
}

但是第二个构造函数不编译: error CS0246: The type or namespace name 'T' could not be found ... 并且 Convert.ToDouble 提示 无法解析方法 'ToDouble(T)' 候选人是...

我知道我可以向泛型类添加一个转换方法:

    public DoubleValueWithUnit ToDoubleValueWithUnit()
    {
        return new DoubleValueWithUnit(Convert.ToDouble(Value), Unit);
    }

行得通。但是是否有可能将带有泛型参数的构造函数添加到非泛型类/结构中?

最佳答案

我认为这个构造函数根本不应该存在:

public DoubleValueWithUnit(ValueWithUnit<T> _valueWithUnit)
{
    Unit = _valueWithUnit.Unit;
    Value = Convert.ToDouble(_valueWithUnit.Value);
}

为什么要转换一个ValueWithUnit<T>DoubleValueWithUnit ?有一些值 T , 这根本不符合逻辑。你如何转换 BinaryFormatterdouble ?或者 Formdouble ?这些根本不应该在编译时被允许。

所以你要么这样做:

public DoubleValueWithUnit(ValueWithUnit<double> _valueWithUnit)
{
    Unit = _valueWithUnit.Unit;
    Value = _valueWithUnit.Value;
}

或者一起移除构造函数。

关于c# - 用泛型对象初始化非泛型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44255689/

相关文章:

c# - C# 上 CURLOPT_RETURNTRANSFER 的等价物是什么?

c# - 将 Excel 列字母转换为数字的算法是什么?

wcf - HttpContext.Current.Request.RawUrl的WCF等效项是什么?

java - 如何从java中的方法返回泛型类型

java - 如何在构造函数数组中查找复制构造函数

c# - 删除条件格式

c# - 给内部类对象赋值

c# - .NET Web 服务客户端调用性能问题

c# - 所有 IP 地址上的 Mono 和 WCF Net.Tcp 绑定(bind)

.net - f# 中的循环类型引用