私はそうのように使用してIEnumerable<T>
を返すメソッドyield return
を書いている:なぜVisual Studioは私の "yield return"メソッドが動的オブジェクトを返すと思いますか?
public IEnumerable<Row> ConvertExcelToRows(IExcelDataReader reader)
{
while (reader.Read())
{
var row = new Row();
// do some work. No dynamic objects here whatsoever
yield return row;
}
}
私は私の方法を消費し、LINQの拡張メソッドでそれに従って、Visual Studioは、タイプdynamic
であることが、戻り値を示しています
症状に至るまで、関連するコードです:
dynamic data = JsonConvert.DeserializeObject(jsonContent);
using (var stream = await DownloadFile(data.docUrl.ToString()))
using (var excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream))
{
var rows = ConvertExcelToRows(excelReader).ToList<Row>();
}
それはList<Row>
なければならない時には、上記撮影画面内rows
のタイプはdynamic
あります。
なぜこれが起こって、どのように私はそれを修正することができますか?
(は私が書いただけのクラスであることに注意してくださいそれはすべてのプリミティブな特性、ダイナミック何も。)
をKEY UPDATE:上のスクリーンショットを改善する過程で、私はの宣言を変更しましたexcelReader
からvar
からIExcelDataReader
までである。 これは私の問題を解決しました。
私がvar
に戻ったとき、推測されたexcelReader
のタイプが確かに伝染性のあるdynamic
であることがわかりました。
はまだ私の方法への動的な入力引数は、出力のタイプを「感染」する理由の説明が大好きです。
'dynamic'は[セリウム、地獄伝染原理のいくつかの種類(https://blogs.msdn.microsoft.com/ericlippert/2012/11/08/dynamic-contagion-part-two/)によって動作します。それに踏み込んだりブラシをかけたりするものは何でもあります(http://static.tvtropes.org/pmwiki/pub/images/invasion-of-the-body-snatchers-78_5124.jpg)。Late Binding Zoneへのポータルを開くと、コンパイラーは気まぐれで妄想的になり始めます。 –
コード内に_everything_を定義する必要があります。 'rows'変数の型、' excelReader'変数の型、戻り値に関連するあなたの "do some work"コードが何をするかを示してください。私たちが作ることができる仮定に基づいて、うまくいくはずですが、あなたは私たちにあなたを信じる理由を与えていません。 –
上流のものが「動的」です。あなたは何を見つける必要があります。 –