Я знаю typeof (T), но компилятор не делает. Как зафиксировать?

Если вы думаете, что обработка ошибок SWIFT 2.0 - это то же самое, что и исключение, вы ошибаетесь.
Это не исключение, это ошибка, которая соответствует протоколу под названием ErrorType.
Цель блока - перехватить ошибку, выданную с помощью функции или метода выброса.
В принципе нет finally, что вы можете сделать, это обернуть ваш код в блок defer, это гарантированно будет выполнено и конец области.
Вот пример из руководства по программированию SWIFT 2

func processFile(filename: String) throws {
    if exists(filename) {
        let file = open(filename)
        defer {
            close(file)
        }
        while let line = try file.readline() {
            /* Work with the file. */
        }
        // close(file) is called here, at the end of the scope.
    }
}

Вы используете оператор отсрочки для выполнения набора операторов непосредственно перед тем, как выполнение кода покидает текущий блок кода. Это позволяет вам выполнить необходимую очистку независимо от того, произошла ли ошибка. Примеры включают закрытие любых дескрипторов открытых файлов и освобождение любой выделенной вручную памяти.

9
задан Lucas 23 June 2009 в 11:07
поделиться

7 ответов

Промежуточное приведение к объекту не идеально, но что-то вроде этого должно помочь:

public static T Test<T>()
{
    if (typeof(T) == typeof(string))
        return (T)(object)"1241";

    // do something else
}
13
ответ дан 4 December 2019 в 08:01
поделиться

Вы должны преобразовать возвращаемое значение в T, например, что-то вроде этого для ссылочных типов:

public static T Test<T>() where T : class
{
  if (typeof(T)==typeof(string))
     return "1241" as T;

  return default(T);
}
6
ответ дан 4 December 2019 в 08:01
поделиться

Осторожно ! Приведенное ниже решение не работает (проверено с использованием компилятора C # Mono gmcs ).

Тем не менее, оно должно работать, исходя из моего чтения стандарта C #, поскольку разрешение перегрузки должно по возможности отдавать предпочтение неуниверсальной версии метода. Соответствующий раздел в ECMA-334 - 25.1.7: «Перегрузка в общих классах». Более того, Эрик Липперт, кажется, тоже так говорит в сообщении в блоге .

Мы будем благодарны за обратную связь: почему это работает не так, как ожидалось?


У вас несвязанные типы и несвязанное поведение : этот код кричит « используйте перегрузку

Generics подходят для несвязанных типов, но идентичное (или очень похожее) поведение.

Сделайте это (завершите тестовую программу для воспроизведения поведения):

using System;

class TestClass {
    public static T Test<T>() {
        return TestWith(default(T));
        // do something else
    }

    public static string TestWith(string dummy) {
        // Used only for `string`.
        return "string";
    }

    public static T TestWith<T>(T dummy) {
        // Used for everything else.
        return dummy;
    }

    static void Main() {
        Console.WriteLine("Expected \"0\", got \"{0}\"", Test<int>());
        Console.WriteLine("Expected \"string\", got \"{0}\"", Test<string>());
    }
}

Скомпилировано с gmcs , это дает:

Expected "0", got "0"
Expected "string", got ""

Здесь параметр служит только для устранение неоднозначности перегруженного звонка. Здесь нельзя использовать явные универсальные параметры, поскольку одна из функций (специализация string ) не является универсальной.

5
ответ дан 4 December 2019 в 08:01
поделиться

Попробуйте

public static T Test<T>() where T : class
{
  if (typeof(T) == typeof(string)) return "asdf" as T;  // do something else
  // do something else        
}
2
ответ дан 4 December 2019 в 08:01
поделиться

Я нашел решение:

public static T Test<T>()
{
  if (typeof(T) == typeof(string))
     return (T)(object)"1241";    // this works.

    // do something else
}

Спасибо за все ответы.

0
ответ дан 4 December 2019 в 08:01
поделиться

Можно ли использовать ChangeType?

public static T Test<T>()
{
    if (typeof(T)==typeof(string))
        return (T)Convert.ChangeType("1234", typeof(T), CultureInfo.InvariantCulture);
    return default(T);
}
1
ответ дан 4 December 2019 в 08:01
поделиться
public static T Test<T>()
{
  if (typeof(T)==typeof(string))
     return (T)Convert.ChangeType("1241", typeof(T));

  return default(T);
}

Я не тестировал его: -)

0
ответ дан 4 December 2019 в 08:01
поделиться
Другие вопросы по тегам:

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