Я предполагаю, что вы знаете, Java стирает любую общую информацию о типе после компиляции (есть метаданные для переменных, но реальные объекты являются недействительными информации общего типа). Кроме того, ваш код не типобезопасен:
@SuppressWarnings({ "unchecked", "rawtypes" })
Вы используете это, потому что вы создаете непараметризированный экземпляр Map
.
В .NET вы не обойдете систему типов, как это, потому что общая информация типа хранится и используется во время работы.
Давайте посмотрим, ваш C# код:
public static class KeyCountMap<T>
Статический класс в C# класс, который не может быть инстанс, он используется для одних его статические члены. Думаю, ты этого не хочешь. Возможно, KeyCountMap
- это статический вложенный класс в Java, а не внутренний класс.
В C# у вас нет внутренних классов. Вложенные классы не делят данные с экземпляром содержащего класса, это значит, что имя содержащего класса является частью пространства имен для вложенного класса. Итак, вам не нужно, и на самом деле не хочу, ключевое слово static
.
{
private Dictionary<T, MutableInt> map = new Dictionary<T, MutableInt>();
В .NET Dictionary
- это класс.Чтобы сохранить намерение, вы должны использовать IDictionary
, соответствующий интерфейс, как тип поля map
.
// ... rest of properties...
public KeyCountMap()
{ }
public void KeyCountMap<T>(T obj) where T : Dictionary<T, MutableInt>
Почему тип возвращаемого типа void
, не является ли это конструктором?
В C# конструкторы не могут быть общими. Вероятно, вам нужен Type
.
Ваш C# код просто не имеет смысла, так вот что вы можете сделать:
public KeyCountMap(Type dictionaryType)
{
if (!typeof(IDictionary<T, MutableInt>).IsAssignableFrom(dictionaryType))
{
throw new ArgumentException("Type must be a IDictionary<T, MutableInt>", nameof(dictionaryType));
}
map = (IDictionary<T, MutableInt>)Activator.CreateInstance(dictionaryType);
}
}
Мы проверяем тип перед созданием экземпляра. Если бы мы этого не сделали, мы бы создали экземпляр, приведение не получилось бы, и назначение не произойдет, так что новый экземпляр будет просто мусором.
Возможно, фактический экземпляр будет прокси; Если это так, вы можете не захотеть проверить тип перед созданием экземпляра.
Вы не можете просто скопировать и вставить Java в C# (или наоборот) и ожидать, чтобы сделать всего несколько изменений, пока он работает, для некоторого определения работы, например он компилируется. Языки не так похожи, и, скорее всего, слишком много тонких вещей ошибочны.
Этот подход может быть интересным сначала, но вы будете спотыкаться так часто, что он скоро перестанет быть вообще забавным. Вы должны изучить основы и понять, как все делается на целевом языке, прежде чем начинать перевод кода по строкам. Много раз вы можете обнаружить, что что-то, что вам нужно было сделать в одной среде, уже существует в другой или наоборот, или что-то может предпринять более или менее шаги для других целей и т. Д.
В данном конкретном случае , Java, сделанный Class
, будет общим классом, тогда как .NET сохранил Type
не-общий класс. В .NET только интерфейсы и делегаты могут указывать общую ковариацию или контравариантность. В любом случае это является довольно ограничительным, если Type
является общим, предполагаемое использование может быть либо ковариантным, либо контравариантным. Но помните, что в Java общий Class<T>
во время выполнения так же хорош, как и Class
, он имеет только какое-либо значение во время компиляции, и вы можете сказать, что компилятор, которого вы знаете лучше, так или иначе.
Какова цель этого? Обратите внимание, что хеш-таблицы/карты/словари не гарантируют никакого заказа. Вы * транслитерируете * Java на C#? Если да, то почему? – acelent
Да, я транслитерирую ради моих требований к проекту – maliks
@acelent Я прокомментировал ваш ответ (принят), пожалуйста, посмотрите – maliks