سؤال
وأود أن يكون وسيلة حيث المعلمة يمكن 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();
}