Понижение приведения функций в UnityScript

На самом деле я опубликовал это на форумах Unity, но ни на один из моих вопросов, связанных с языком, там не ответили. Итак, скажем, у меня есть функция, определенная так в Unity Script:

function GetSomething : SomeClass
{
   return new SomeClass();
}

Где SomeClass — это некоторый класс, определенный в другом месте. Теперь у меня есть переменная theFunction типа Function, и я хочу убедиться, что она что-то возвращает. Итак, что я делаю, это следующее:

// theFunction is set to GetSomething somewhere else in the program.
var functionThatReturnsSomething = theFunction as function() : Object;

if (functionThatReturnsSomething != null)
//... call it and do stuff with the returned value.

Теперь, к сожалению, в приведенном выше коде functionThatReturnsSomething будет нулевым. Чтобы он не был нулевым, я должен быть более конкретным и привести к function() : SomeClass ИЛИ просто переопределить определение функции, чтобы вернуть объект следующим образом:

function GetSomething : Object
{
   return new SomeClass();
}

Это очень раздражает, потому что легко забыть сделать :Object (тем более, что если вы его пропустите, он будет правильно считать, что он имеет возвращаемый тип SomeClass), и результатом является не ошибка, а очень тонкая ошибка, поскольку литье не удается. Есть ли способ получить поведение, которое я хочу, то есть правильное понижение до function() : Object, так же, как я могу понижать нормальные объекты?


person Francisco Ryan Tolmasky I    schedule 26.04.2013    source источник
comment
эм... Почему бы вам просто не вызвать функцию по имени? Какой смысл иметь объект сам по себе?   -  person noob    schedule 27.04.2013
comment
Моя программа буквально не делает вышеперечисленное, это ситуация, возникающая из класса, который может удерживать обратный вызов. Обратный вызов имеет тип Function, и пользователь API может выбрать обратный вызов, который либо возвращает значение (и это значение используется), либо возвращает void. Я использую приведение типов, чтобы проверить, в какой из ситуаций я нахожусь.   -  person Francisco Ryan Tolmasky I    schedule 27.04.2013
comment
Так что я согласен, зачем делать объект? почему бы просто не установить и не получить этот фрагмент данных?   -  person crychair    schedule 26.03.2014


Ответы (1)


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

#pragma strict

import System.Collections.Generic;

function Start ()
{
    // theFunction is set to GetSomething somewhere else in the program.
    var functionThatReturnsSomething = GetSomething as function() : Object;

    if (functionThatReturnsSomething != null)
    {
        //... call it and do stuff with the returned value.
        Debug.Log(functionThatReturnsSomething);
    }
    else Debug.Log("null");
}

function GetSomething() : List.<int>
{
    return new List.<int>();
}
person Tubeliar    schedule 11.11.2014