Почему не делает этого использования неявной работы бросков?

Можно загрузить DLL или EXE в Redgate (раньше Lutz Roeder) .Net Отражатель , выбрать метод и затем желаемый язык от комбинации языка. Код выбранного метода будет отображен на выбранном языке.

я надеюсь, что это помогает.

10
задан mackenir 2 October 2009 в 10:19
поделиться

2 ответа

Проблема в том, что вы пытаетесь неявно преобразовать в 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.)

17
ответ дан 3 December 2019 в 19:34
поделиться

Может быть, небольшая опечатка?

Lazy<List<string>> lazyStrings = new Func<List<string>>(MakeStringList);
IList<string> strings = lazyStrings; //ERROR
List<string> strings = lazyStrings; //OK

Если вам нужен IList <>, это двухэтапное преобразование, и я полагаю, что компилятор не хочет чтобы опередить себя

IList<string> istrings = strings;
3
ответ дан 3 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: