C # передача Single в качестве ссылки - PullRequest
0 голосов
/ 14 сентября 2009

Я хотел бы иметь метод, где параметр может быть Int32 или Single:

void myMethod( ref object x )
{
     //...CodeHere
}

Поскольку C # не позволяет мне проходить специализацию объекта при использовании out или ref, найденное мной решение гласило, что присвоения переменной переменной типа object будет достаточно:

Single s = 1.0F;
object o = s;
myMethod( ref o );

Это не сработало. Согласно документации Microsoft, на которую я смотрел, o должен быть указателем на s. Источники, на которые я смотрел, утверждают, что назначение не примитивных типов генерирует ссылку, а не экземпляр new.

Можно ли иметь метод, в котором я могу передать Single или Int32 или любой другой тип, который является специализацией object?

Ответы [ 5 ]

9 голосов
/ 14 сентября 2009

Перегрузить метод:

void myMethod( ref int x )
{
    //...
}

void myMethod(ref single x)
{
    //...
}
1 голос
/ 14 сентября 2009

«Я хотел бы иметь метод, в котором параметр может быть Int32 или Single»

Как насчет использования Универсального метода вместо?

Примечание: в текущей версии C # вы можете ограничивать допустимые типы только такими структурами, как int, float.

1 голос
/ 14 сентября 2009

К сожалению, вам не повезло. Вам будет лучше использовать два метода:

void MyMethod(ref float x)
{
  //....
}

void MyMethod(ref int x)
{
  //....
}
0 голосов
/ 14 сентября 2009

Я бы, вероятно, использовал подход Эша и пошел бы с общей реализацией следующего вида:

    static void myMethod<T>(ref T value) where T : struct, IConvertible, IComparable<T>, IEquatable<T>
    {
        value = (T)Convert.ChangeType(value.ToSingle(CultureInfo.CurrentCulture) * 2.0, typeof(T));
    }

    static void Main(string[] args)
    {
        int data1 = 5;

        myMethod(ref data1);
        if (data1 != 10)
            throw new InvalidOperationException();

        Single data2 = 1.5f;

        myMethod(ref data2);
        if (data2 != 3)
            throw new InvalidOperationException();
    }
0 голосов
/ 14 сентября 2009

Вместо помещения значения в объект вы можете перегрузить функцию:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
        }

        static int test = 0;

        static void MyMethod(int arg)
        {
            test += arg;
        }

        static void MyMethod(ref int arg)
        {
            test += arg;
        }

        static void MyMethod(Single arg)
        {
            test += Convert.ToInt32(arg);
        }

        static void MyMethod(ref Single arg)
        {
            test += Convert.ToInt32(arg);
        }
    }
}

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

...