IList.Cast<typeof(T)>() がエラーを返す、構文は問題ないようです
-
09-06-2019 - |
質問
public static IList<T> LoadObjectListAll<T>()
{
ISession session = CheckForExistingSession();
var cfg = new NHibernate.Cfg.Configuration().Configure();
var returnList = session.CreateCriteria(typeof(T));
var list = returnList.List();
var castList = list.Cast<typeof(T)>();
return castList;
}
そのため、「list」要素を汎用 IList にキャストしているときにビルド エラーが発生します。ここに明らかな間違いがある人はいますか?
解決
T
タイプでもありません System.Type
. T
型パラメータです。 typeof(T)
の型を返します T
. 。の typeof
演算子はオブジェクトに作用せず、 Type
型のオブジェクト。 http://msdn.microsoft.com/en-us/library/58918ffs.aspx
@Johnはあなたの直接の質問に正しく答えています。しかし、そこにある NHibernate コードは少し間違っています。を設定すべきではありません ISessionFactory
後 を得る ISession
, 、 例えば。
public static T[] LoadObjectListAll()
{
var session = GetNewSession();
var criteria = session.CreateCriteria(typeof(T));
var results = criteria.List<T>();
return results.ToArray();
}
他のヒント
私は思う
var castList = list.Cast<typeof(T)>();
あるべきです
var castList = list.Cast<T>();
@jon limjap私が見ることができる最も明白なエラーは
IList
とは明らかに違うIList<T>
. 。アンIList
非世です(例、ArrayList
).
元の質問はすでに IList<T>
. 。誰かが書式設定を編集したときに削除されました。おそらくMarkdownに問題があると思われます。
現在修正済みです。
IList は IList<T> ですが、彼女が投稿したときにマークダウンによって混乱しただけです。フォーマットしようとしましたが、<T> をエスケープし忘れました。修正中です。
CLI は、デリゲートを使用する場合、共分散と反変性のジェネリック引数のみをサポートしますが、ジェネリックを使用する場合はいくつかの制限があります。たとえば、文字列をオブジェクトにキャストできるため、ほとんどの人は List to a List を使用して同じことができると考えるでしょうが、一般的なパラメーター間に共分散がないため、これを行うことはできませんが、この記事でわかるように共分散をシミュレートすることはできます。したがって、抽象ファクトリによって生成されるランタイム型に依存します。
それはマルコフ連鎖のように見えます...ブラボー。
T はすでに型パラメータであるため、typeof を呼び出す必要はありません。TypeOf は型を受け取り、その型パラメータを返します。
「元の質問ではすでに IList<T>
. 。誰かが書式設定を編集したときに削除されました。おそらくマークダウンの問題です。」
それが私が見たものですが、誰かによって編集されており、それが共分散についての説明を載せた理由ですが、何らかの理由で -1 にマークダウンされました。
一時変数が多すぎてわかりにくい
の代わりに
var returnList = session.CreateCriteria(typeof(T));
var list = returnList.List();
var castList = list.Cast<typeof(T)>();
return castList;
ただやってください
return session.CreateCriteria(typeof(T)).List().Cast<T>();
@ジョナサン・ホランド
T はすでに型パラメータであるため、typeof を呼び出す必要はありません。TypeOf は型を受け取り、その型パラメータを返します。
typeof
型を「受け取って」、その型を返します System.Type
@Jon と @Jonathan は正しいですが、戻り値の型も次のように変更する必要があります。
IList<T>
また。それが単なるマークダウンのバグでない限り。
@ジョナサン, 、そうだと思いました。
使用している nHibernate のバージョンがわかりません。私はまだ 2.0 のゴールド リリースを試していませんが、いくつかの行を削除することでメソッドをクリーンアップできます。
public static IList<T> LoadObjectListAll()
{
ISession session = CheckForExistingSession();
// Not sure if you can configure a session after retrieving it. CheckForExistingSession should have this logic.
// var cfg = new NHibernate.Cfg.Configuration().Configure();
var criteria = session.CreateCriteria(typeof(T));
return criteria.List<T>();
}
私が見た中で最も明らかな間違いは、 IList
とは明らかに違う IList<T>
. 。アン IList
非汎用的である (例: ArrayList
).
したがって、メソッドのシグネチャは次のようになります。
public static IList<T> LoadObjectListAll()