0
我有以下泛型方法,我想封裝一些執行以下操作的邏輯:如果實例是ILookUp(這是我自己的通用接口類型) null,然後調用一個帶有null參數的方法(如果不是null),然後使用接口中ID字段的值調用同一個方法。將泛型枚舉參數強制爲可空的時出現異常
ID字段始終是基於ulong的枚舉類型。 ID字段永遠不會爲null,但我仍想將其轉換爲可空類型。
但是,我得到一個InvalidCastException指定的語句。奇怪的是,在Watch窗口中,演員表演得很好。什麼可能會出錯..?
/// <summary>
/// if not null, extracts an ID and snapshots it as a nullable ulong (ulong?)
/// </summary>
public Id? SnapshotID<T, Id>(T instance)
where T : ILookUp<T, Id>
where Id : struct // is always an enum based on ulong
{
if (instance != null)
{
ulong? enumAsULong = (ulong?)((ValueType)instance.ID); // <- InvalidCastException here
return (Id?)(ValueType)DoEnumNullable(enumAsULong);
}
else
{
return (Id?)(ValueType)DoEnumNullable((ulong?)null);
}
}
public ulong? DoEnumNullable(ulong? val)
{
return DoUInt64Nullable(val);
}
public interface ILookUp<T,Id>
where T : ILookUp<T,Id>
where Id : struct // cannot specify enum - this allows nullable operations on Id enums
{
Id ID { get; }
}
大,現在它工作。第二行也給出錯誤,我不得不改變返回(Id?)(ValueType)DoEnumNullable(enumAsulong)返回(Id)(ValueType)DoEnumNullable(enumAsULong)使其工作。 – 2014-08-28 19:40:53
我會閱讀這個問題,看看我能理解爲什麼。 – 2014-08-28 19:42:40