не может преобразовать тип 'строка' в 'интервал?' через ссылочное преобразование, упаковывая преобразование, распаковывая преобразование, перенося преобразование или пустое преобразование типов

Во-первых, сделайте класс списка реализующим Сериализуемый .

public class Object implements Serializable{}

Затем вы можете просто привести список к (Сериализуемый). Вот так:

List<Object> list = new ArrayList<Object>();
myIntent.putExtra("LIST", (Serializable) list);

И чтобы получить список, который вы делаете:

Intent i = getIntent();
list = (List<Object>) i.getSerializableExtra("LIST");

Вот и все.

8
задан 26 July 2012 в 17:57
поделиться

5 ответов

Компилятор знает, что строка никогда не может быть int? , чтобы он вам это сказал. Это не значит, что int? бесполезен. Ваш вариант использования далек от нормального. Обычный вариант - «Я хочу представить целое число и вероятность того, что значение отсутствует / неизвестно». Для этого очень хорошо работает int? .

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

Обратите внимание, что вы можете использовать как с типами, допускающими значение NULL, для распаковки:

object o = "hello";
int? i = o as int?;

if (i == null)
{
    // o was not a boxed int
}
else
{
    // Can use i.Value to recover the original boxed value
}

РЕДАКТИРОВАТЬ: увидев ваш комментарий, вы не используете как для анализа. Вероятно, вы захотите использовать int.TryParse :

string text = "123":
int value;
if (int.TryParse(text, out value))
{
    Console.WriteLine("Parsed successfully: {0}", value);
}
else
{
    Console.WriteLine("Unable to parse text as an integer");
}

Если вы ' убедитесь, что строка должна быть целым числом (в противном случае это ошибка), тогда вы можете просто использовать int.Parse :

int value = int.Parse(text);

Это вызовет исключение в случае сбоя синтаксического анализа.

Обратите внимание также что оба этих метода позволяют вам указать поставщика формата (обычно информацию о культуре), который позволяет вам выражать, как числа выражаются в этом формате (например, разделители тысяч).

РЕДАКТИРОВАТЬ: В ответ на ваш новый вопрос компилятор предотвращает это, потому что знает, что строка не может , возможно, быть заключенным в рамку int - преобразование никогда не будет успешным. Когда он знает только, что исходное значение является объектом, он может преуспеть.

Например, предположим, я сказал вам: «Вот форма: это квадрат?» Это разумный вопрос. Разумно спросить: можно » Трудно сказать, не глядя на форму.

Но если бы я сказал: «Вот треугольник: это квадрат?» Тогда у вас будет разумное право посмеяться мне в лицо, поскольку треугольник не может быть квадратом - вопрос не имеет смысла.

18
ответ дан 5 December 2019 в 07:36
поделиться

int? является целым числом, допускающим значение NULL, оно не имеет ничего общего с приведением типов и ключевым словом as. «String» - это объект строкового типа, который не может быть преобразован в int (допускающий или не допускающий значения NULL).

Ключевое слово as практически то же самое, что приведение с использованием скобок, за исключением того, что оно не возвращает ошибку, оно устанавливает для объекта значение null:

int i = 1;

object o = i; //boxing

int j = (int)o; //unboxing

Этот первый пример работает, поскольку объект, назначенный для o, является int.

Теперь рассмотрим:

string i = "MyString";

object o = MyString;

 int j = (int)o //unboxing raises exception

 int j = o as int; //raises compilation Error as int is not nullable
 int? j = o as int?; /// o == null

Я надеюсь, что это поможет объяснить разницу между двумя концепциями.

Ричард

1
ответ дан 5 December 2019 в 07:36
поделиться

int? означает целочисленный тип, допускающий значение NULL, а не int, который может содержать переменные любого другого типа.

Если вам нужен тип переменной, который может содержать int или строку, вам придется использовать объект или строку, я полагаю , а затем жить жизнью, наполненной приведением типов. Но я не знаю, зачем вам это нужно.

int? позволяет хранить любое целочисленное значение или нулевое значение. Это полезно, когда ответ на вопрос «Сколько заказов разместил этот человек» - это законное «Я не знаю» вместо количества заказов или ноль, что означает «Я точно знаю, что этот человек никогда не делал. разместил заказ ».

2
ответ дан 5 December 2019 в 07:36
поделиться

, но вы можете проверить значение null и установить его на null.

int? blah;
if (blah == null)
{}
0
ответ дан 5 December 2019 в 07:36
поделиться

Я хочу добавить дополнительную информацию.

Другой случай, почему приведение неверно и компилятор выдает ошибку при компиляции, это System.String имеет маркировку опломбированный . Таким образом, компилятор знает, от каких типов наследуется System.String и к каким типам можно привести строку, используя как -оператор.

Благодаря ключевому слову sealed компилятор также знает, что вы не можете унаследовать от System.String для добавления функций или реализации некоторых дополнительных интерфейсов.

] Приведенный ниже код является примером, и компилятор выдаст следующую ошибку при компиляции

Невозможно преобразовать тип «SealedClass» в 'ICastToInterface' через ссылку конвертация, конвертация бокса, распаковка конвертация, упаковка преобразование или преобразование нулевого типа

public class UnsealedClass {
  // some code
}

public sealed class SealedClass {
  // some code
}

public interface ICastToInterface {
  // some code
}

public class Test {

  public Test() {
    UnsealedClass unsealedClass = new UnsealedClass();

    SealedClass sealedClass = new SealedClass();

    ICastToInterface unsealedCast = unsealedClass as ICastToInterface;  // This works fine

    ICastToInterface sealedCast = sealedClass as ICastToInterface; // This won´t compile, cause SealedClass is sealed
  }
}
1
ответ дан 5 December 2019 в 07:36
поделиться
Другие вопросы по тегам:

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