[英]C# generic return with generic type set in the method not in the call
我正在嘗試建立一種從數據庫中檢索數據的方法,並根據其中的數據來創建具有通用組件的類並將其合並。
public class MyObject<T> where T : BaseMyType
{
T MyTypedObject { get; set; }
}
public class MyType1 : BaseMyType
{
string Key { get; set; }
}
public class MyType2 : BaseMyType
{
Guid Id { get; set; }
}
public MyObject<T> MyMethod<T>() where T : BaseMyType
{
if(Situation1)
return new MyObject(MyType1);
else
return new MyObject(MyType2);
}
此代碼抱怨MyObject <MyType1>無法轉換為MyObject <T>。 現在,我需要像這樣使用它:
var myObject = MyMethod();
當然,電話抱怨它不能從用法中推斷類型。 我了解編譯器錯誤消息,但是我不確定該怎么做。
它無法完成,但是……讓我們暫時考慮一下,我們可以為下面的語句找到所需的編譯方式:
var myObject = MyMethod();
那么使用myObject
的代碼是什么樣的? 在這種假設的情況下,變量myObject
有時會具有類型MyType1
,有時會具有類型MyType2
。 使用myObject
的代碼會關心嗎?
如果所有代碼將使用共享基本類型的成員(即BaseMyType
),則此修復很容易。 只需忘記通用方法即可:
public BaseMyType MyMethod()
{
if(Situation1)
return new MyType1();
else
return new MyType2();
}
如果它確實關心差異(即需要根據返回的類型訪問Key
或Id
),那么即使您可以做不可能的事情,調用代碼仍將需要根據條件有條件地處理各個方案。 Situation1
變量。 這將意味着你把支票Situation1
在錯誤的地方。
相反,您的呼叫者應該看起來像這樣:
if (Situation1)
{
MyType1 myObject = MyMethod1();
// do situation 1 stuff
}
else
{
MyType2 myObject = MyMethod2();
// do situation 2 stuff
}
原始MyMethod()
的實現已分為兩個方法,分別對應於兩種情況的MyMethod1()
和MyMethod2()
。 再次注意,在實現中完全缺少泛型。 它不是必需的,並且不會起作用。
甚至有可能需要調用方的多態實現,即,這樣就不必多次檢查“ Situation1
1”。 但是如果沒有一個好的, 最小的 , 完整的代碼示例 ,就不可能對這種可能性進行更徹底的評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.