سؤال

وأود أن يكون وسيلة حيث المعلمة يمكن Int32 أو Single:

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

ومنذ C # لا يسمح لي لتمرير تخصص الكائن عند استخدام out أو ref، ادعى الحل وجدت أن تعيين المتغير إلى متغير من نوع object سيكون كافيا:

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

وهذا لم تنجح. استنادا إلى وثائق مايكروسوفت نظرت، وينبغي أن يكون o مؤشر إلى s. مصادر نظرت إلى الدولة التي تعيين أنواع غير البدائية توليد إشارة وغير مثيل new.

هل من الممكن أن يكون وسيلة أين يمكنني تمرير Single أو Int32 أو أي نوع آخر الذي هو تخصص object؟

هل كانت مفيدة؟

المحلول

والزائد الطريقة:

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

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

نصائح أخرى

ومما يؤسف له، وكنت من الحظ. عليك أن تكون أفضل حالا باستخدام طريقتين:

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

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

و"أود أن يكون وسيلة حيث المعلمة يمكن أن يكون Int32 أو واحدة"

وماذا عن استخدام طريقة عام بدلا من ذلك؟

وNB: في الإصدار الحالي من C # يمكنك أن تكون فقط قادرة على تقييد أنواع المسموح بها إلى بنية أنواع لا محددة مثل كثافة، تطفو

وبدلا من الملاكمة القيمة في كائن، هل يمكن أن تفرط في وظيفة:

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);
        }
    }
}

وماذا تفعل مع الحجة داخل الطرق يعتمد على ما كنت تحاول إنجاز، بطبيعة الحال.

وأنا ربما استخدام نهج الرماد وتذهب مع تطبيق عام على غرار ما يلي:

    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();
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top