Re[3]: Неправильно определяется область видимости для intern
От: nikov США http://www.linkedin.com/in/nikov
Дата: 05.08.11 16:33
Оценка: 49 (2)
Здравствуйте, Mumitroller, Вы писали:

M>>> В случае internal я ожидаю, что тоже все скомпилируется, как это происходит в c#.


N>>В C# это ошибка дизайна.


M>Неожиданно, однако...


M>А в чем она заключается?


C# разрешает иметь нетранзитивное множество атрибутов InternalVisibleTo, что приводит ко всяким странным эффектам (например, возможность существования класса, который не видит базовый класс своего базового класса, или возможность существования метода, который сам видим, а тип его возвращаемого значения — нет), которые чрезвычайно трудно учесть, и которые, соответственно, стали причиной многих багов при обработке таких ситуаций в компиляторе.
Неправильно определяется область видимости для internal
От: Mumitroller Беларусь  
Дата: 05.08.11 15:37
Оценка:
Вот такой код в двух сборках.

ClassLibrary1:
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("ConsoleApplication1")]
internal enum InternalEnum
{
}

ConsoleApplication1:
module Program
{
  internal Foo(_ : InternalEnum) : void // <=== Error: Method `Foo' is more accessible than `InternalEnum'
  {
  }
}


Если у Foo область видимости private — то скомпилируется (это правильно). Если public или protected — то будет такая же ошибка компиляции (это тоже правильно). В случае internal я ожидаю, что тоже все скомпилируется, как это происходит в c#.

Пример на c#.

ClassLibrary1:
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("ConsoleApplication1")]
internal enum InternalEnum
{
}

ConsoleApplication1:
public static class Program
{
    internal static void Foo(InternalEnum arg)
    {
    }
}

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re: Неправильно определяется область видимости для internal
От: nikov США http://www.linkedin.com/in/nikov
Дата: 05.08.11 16:10
Оценка:
Здравствуйте, Mumitroller, Вы писали:

M> В случае internal я ожидаю, что тоже все скомпилируется, как это происходит в c#.


В C# это ошибка дизайна.
Re[2]: Неправильно определяется область видимости для intern
От: Mumitroller Беларусь  
Дата: 05.08.11 16:16
Оценка:
Здравствуйте, nikov, Вы писали:

M>> В случае internal я ожидаю, что тоже все скомпилируется, как это происходит в c#.


N>В C# это ошибка дизайна.


Неожиданно, однако...

А в чем она заключается? И как быть, если из какой-то конкретной сборки хочется получить доступ к internal другой сборки? Я использую такой подход для юнит-тестов. Видимо, надо делать как-то по-другому?

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[4]: Неправильно определяется область видимости для intern
От: Mumitroller Беларусь  
Дата: 06.08.11 08:06
Оценка:
Здравствуйте, nikov, Вы писали:

N>>>В C# это ошибка дизайна.


M>>Неожиданно, однако...

M>>А в чем она заключается?

N>C# разрешает иметь нетранзитивное множество атрибутов InternalVisibleTo, что приводит ко всяким странным эффектам (например, возможность существования класса, который не видит базовый класс своего базового класса, или возможность существования метода, который сам видим, а тип его возвращаемого значения — нет), которые чрезвычайно трудно учесть, и которые, соответственно, стали причиной многих багов при обработке таких ситуаций в компиляторе.


Но, ведь какая удобная ошибка! Добавляешь один атрибут к сборке и получаешь готовый white box для тестирования. Раз это объявлено ошибкой, значит должен быть какой-то "правильный" способ получить тот же результат? Только я не могу его найти. Может быть кто-то подскажет?

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.