2014-08-28 48 views
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; } 
    } 

回答

1

你不能那樣做。 You can only cast a boxed value type to the same type or Nullable<T>。在這種情況下,您可以將其轉換爲T?Nullable<YourEnumType>但不能使用其他類型。

以下應該工作。

ulong? enumAsULong = (ulong)((ValueType)instance.ID); 

​​
+0

大,現在它工作。第二行也給出錯誤,我不得不改變返回(Id?)(ValueType)DoEnumNullable(enumAsulong)返回(Id)(ValueType)DoEnumNullable(enumAsULong)使其工作。 – 2014-08-28 19:40:53

+0

我會閱讀這個問題,看看我能理解爲什麼。 – 2014-08-28 19:42:40