有时我没有得到C#Generics <script id="gridtemplate" type="text/x-kendo-template">
<tr>
<td>
#= firstname #
</td>
<td>
#= surname #
</td>
<td>
#= birthdate #
</td>
<td>
#= classname #
</td>
#=foreach(var r in results)
{
//if r.assessmentid == assessment in header (mapdetails)
<td>r.resultvalue</td>
else
<td></td>
}
#
</tr>
的权利。我有一个通用的结构
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
应该是数字,但没有可用于此目的的约束)。
对于WCF,我需要一个非泛型版本,T
为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; }
}
和Convert.ToDouble抱怨
error CS0246: The type or namespace name 'T' could not be found ...
我知道我可以在泛型类中添加转换方法:
Cannot resolve method 'ToDouble(T)' Candidates are...
有效。但是有没有可能将带有泛型参数的构造函数添加到非泛型类/ struct?
答案 0 :(得分:2)
我认为这个构造函数根本不存在:
DefaultDrawSortGlyph
为什么要将compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8'
compile 'com.android.support:design:25.0.0'
compile 'com.google.firebase:firebase-storage:10.2.4'
compile 'com.github.bumptech.glide:glide:4.0.0-RC0'
compile 'com.google.firebase:firebase-storage:10.2.4'
转换为public DoubleValueWithUnit(ValueWithUnit<T> _valueWithUnit)
{
Unit = _valueWithUnit.Unit;
Value = Convert.ToDouble(_valueWithUnit.Value);
}
?使用ValueWithUnit<T>
的某些值,这没有意义。如何将DoubleValueWithUnit
转换为T
?还是BinaryFormatter
到double
?在编译时不应该允许这些。
所以你要么这样做:
Form
或者一起删除构造函数。
答案 1 :(得分:0)
在第二个例子中,T根本没有定义。所以你不能在该结构的上下文中使用T.
只需删除此构造函数:
public DoubleValueWithUnit(ValueWithUnit<T> _valueWithUnit)
由于您希望转换传递给Double的任何内容,因此定义一个构造函数作为对象的输入。在构造函数中,如果对象不可转换,请尝试强制转换并抛出异常。
public DoubleValueWithUnit(object obj, Unit unit)
{
Unit = unit;
try
{
Value = Convert.ToDouble( obj );
}
catch( Exception )
{
throw new ArgumentException("Cannot convert to double", nameof(obj) );
}
}
答案 2 :(得分:0)
我目前的解决方案是让结构实现一个通用接口,该接口继承自非通用接口:
public struct ValueWithUnit<T> : IValueWithUnit<T> {...}
public interface IValueWithUnit<out T> : IValueWithUnit // where T: number
{
new T Value { get; }
}
public interface IValueWithUnit
{
object Value { get; }
Unit Unit { get; }
}
现在,我可以将ValueWithUnit<T>
传递给(已修改的)构造函数:
public DoubleValueWithUnit(IValueWithUnit _valueWithUnit)
{
Unit = _valueWithUnit.Unit;
Value = Convert.ToDouble(_valueWithUnit.Value);
}
我仍然不确定是否有更好的解决方案。