有一個很大的代碼庫,我試圖在這裏處理。一旦問題出現,根據我所想要知道的數據對象是與一些參數,一個結構即形式:c#中的類型意外的行爲,不能重鑄到一個結構
public struct MyData
{
public float A;
public float B;
}
有這些類型的集合,但是當我鑽到這些條目中的每一個條目都應該有這些類型之一,我發現雖然我正在查看上面的基礎結構,但我不能使用「點形式」,比如說object.A來獲取它的價值。當我嘗試將其轉換爲結構時,我得到一個問題,因爲我指向的對象說這是一個不同的類型,但是在查看它時是正確的格式。我認爲這可能與被定義爲集合有關
var outputData = new myCollection<Tstuff>();
這是cast語句。
var myCast = (MyData) MyObject.Value;
我得到一個問題,我無法將類型轉換爲Tstuff到MyData。因爲它懸停在MyObject上,所以它的類型是KeyValuePair。
但是在調試時,奇怪的是在Visual Studio即時窗口允許我這樣做,比如我就可以做到以下幾點:
myCast.A
和問題返回浮動。這兩個問題是:
1)爲什麼我不能做演員時object.Value是正確類型的明確 - 確定當我使用.GetType()
2)爲什麼我可以做演員在Visual Studio的直接窗口中,但不在代碼的主體中。
在此先感謝。很抱歉,很難發佈。這是一個龐大的代碼集,我只是參與其中。
下面是一些謎題的附加部分:
var outputData = new myCollection<Tstuff>();
縱觀定義MyCollection的,我們得到如下:
public class myCollection<Tstuff> : BaseTransferValueCollection<string, Key, Tstuff>
{
public myCollection();
}
如果我們深入到該繼承的類:
public abstract class BaseTransferValueCollection<TP, TKey, TValue> : Dictionary<TP, IList<KeyValuePair<TKey, TValue>>>
{
}
這裏是添加過程:
dResults.Add(new KeyValuePair<Key, MyData>(
new Key(kvpS.Key, id),
new MyData
{
A = 100.00,
B = 200.00,
}));
對不起,它不容易追蹤代碼中的東西。因此,要總結:
的MyObject如下所示,當我們將鼠標懸停在它:
{[ida:765687645, idb:463786843, xxx.xxx.xxx.MyData]}
您可以使用Tstuff中的where子句,以便強制執行所有Tstuff條目都將實現某個允許您獲取MyData值的接口的規則嗎? – Ted
@泰德,你能擴展嗎? – disruptive
如果您無法更改任何內容以添加約束,請嘗試先將其轉換爲對象:var myCast =(MyData)(object)MyObject.Value;然而,這是非常危險的代碼,如果你在這個泛型集合中使用了除MyData以外的其他東西,它將會中斷。 – Ted