Можно загрузить DLL или EXE в Redgate (раньше Lutz Roeder) .Net Отражатель , выбрать метод и затем желаемый язык от комбинации языка. Код выбранного метода будет отображен на выбранном языке.
я надеюсь, что это помогает.
Проблема в том, что вы пытаетесь неявно преобразовать в IList
, а IList
не охвачен IList
(даже если они одного типа) - при включении рассматриваются только преобразования в типы, не являющиеся интерфейсами. Из раздела 6.4.3 спецификации C # 3.0:
Если стандартное неявное преобразование (§6.3.1) существует от типа A до тип B, и если ни A, ни B не являются interface-types , то A называется окружен B, и B называется охватывают A.
В разделе 6.4.4, говоря об определяемых пользователем преобразованиях, одним из шагов является (выделено мной):
- Найти набор применимых пользовательских и расширенных преобразований операторов, U.
Этот набор состоит из определяемых пользователем и снял неявное преобразование операторы, объявленные классами или структуры в D, которые преобразуются из типа охватывающий S до типа охватываемого Автор T . Если U пусто, преобразование undefined и ошибка времени компиляции occurs.
IList
isn't encompassed by IList
, therefore this step fails.
The compiler will do "chained" implicit conversions in other scenarios though - so if you actually had a Lazy
you could write:>
object strings = lazyStrings;
works, because List
is encompassed by object
(as both are classes, and there's a standard implicit conversion from List
to object
).
Now as for why this is the case, I suspect it's to stop odd cases where you'd expect a reference conversion, but you would actually get the implicit conversion. Suppose we had:
class ListLazy : Lazy<IList<string>>, IList<string>
{
// Stuff
}
...
Lazy<IList<string>> x = new ListLazy();
IList<string> list = x;
Which conversion should be used? There's an implicit reference conversion from the actual type to IList
... but the compiler doesn't know that, because the expression is of type Lazy
. Basically interfaces are awkward because they can show up later in the type hierarchy, whereas with a class you always know where you are, if you see what I mean. (Implicit conversions which involve two classes in the same hierarchy are prohibited.)
Может быть, небольшая опечатка?
Lazy<List<string>> lazyStrings = new Func<List<string>>(MakeStringList);
IList<string> strings = lazyStrings; //ERROR
List<string> strings = lazyStrings; //OK
Если вам нужен IList <>, это двухэтапное преобразование, и я полагаю, что компилятор не хочет чтобы опередить себя
IList<string> istrings = strings;