【发布时间】:2014-09-05 11:41:25
【问题描述】:
我怎样才能实现一个结构,以便可以执行以下转换?
var a = new StatusedValue<double>(1, false);
var b = (StatusedValue<int>)a;
我的实现应该与Nullable<T> 类似,它工作正常。但是,此代码因System.InvalidCastException 而失败:
public struct StatusedValue<T> where T : struct
{
public StatusedValue(T value) : this(value, true)
{
}
public StatusedValue(T value, bool isValid)
{
this.value = value;
this.isValid = isValid;
}
private T value;
private bool isValid;
public static implicit operator StatusedValue<T>(T value)
{
return new StatusedValue<T>(value);
}
public static explicit operator T(StatusedValue<T> value)
{
return value.value;
}
}
结果:
无法将“StatusedValue`1[System.Double]”类型的对象转换为类型 'StatusedValue`1[System.Int32]'。
【问题讨论】:
-
不是一个真正的答案,但也许这个(以及该系列的其余部分)对你来说可能很有趣:Nullable micro-optimization, part four
-
你确定这段代码会抛出
InvalidCastException吗?我什至无法编译这段代码。 -
对不起,原代码有点不同,但重点是一样的
-
看看this question,看看 Jon Skeet 的回答和 Eric Lippert 的评论(比这更好吗?!?)
-
什么保持不变?如果原始代码不同,您需要发布模拟原始代码而不是不同的代码。如果您发布不同的代码,答案也会有所不同。
标签: c# generics struct casting