有时我没有正确理解 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
是一个enum
,T
应该是数字,但没有可用于该目的的约束)。
对于 WCF,我需要一个非泛型版本,T
是 double
。所以我想到了:
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
, 这根本不符合逻辑。你如何转换 BinaryFormatter
至 double
?或者 Form
至 double
?这些根本不应该在编译时被允许。
所以你要么这样做:
public DoubleValueWithUnit(ValueWithUnit<double> _valueWithUnit)
{
Unit = _valueWithUnit.Unit;
Value = _valueWithUnit.Value;
}
或者一起移除构造函数。
关于c# - 用泛型对象初始化非泛型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44255689/