هل من الممكن في C # الزائد عامل يلقي عام بالطريقة التالية؟
-
06-07-2019 - |
سؤال
وأتساءل فقط إذا كان هناك أي حال لتمثيل التعليمة البرمجية التالية في C # 3.5:
public struct Foo<T> {
public Foo(T item) {
this.Item = item;
}
public T Item { get; set; }
public static explicit operator Foo<U> ( Foo<T> a )
where U : T {
return new Foo<U>((U)a.Item)
}
}
والشكر
المحلول
وشركات التحويل لا يمكن أن يكون عام. من قسم المواصفات 10.10، وهنا شكل تحويل مشغل-إعالن:
<اقتباس فقرة>conversion-operator-declarator: implicit operator type ( type identifier ) explicit operator type ( type identifier )اقتباس فقرة>
وقارن هذا مع، ويقول، طريقة الرأس:
<اقتباس فقرة><ط> طريقة الرأس : <ط> سمات <الفرعية> التقيد الفرعي> طريقة معدلات <الفرعية> التقيد الفرعي> جزئية <ط> <الفرعية> التقيد الفرعي> <ط> عودة من نوع <ط> الأعضاء اسم نوع معلمة قائمة <الفرعية> التقيد الفرعي> (<ط> رسمية المعلمة القائمة <الفرعية> التقيد الفرعي> ط >) <ط> نوع معلمة القيود على بنود <الفرعية> التقيد الفرعي>
اقتباس فقرة>و(عذرا عن التنسيق - ولست متأكدا كيف نفعل ذلك أفضل)
لاحظ أن شكل المشغل لا يتضمن القائمة نوع معلمة أو قيود معلمة نوع.
نصائح أخرى
والتعليمات البرمجية يغلي وصولا الى خط: return new Foo<U>((U)a.Item)
وأين كنت في محاولة لتعيين baseclass إلى فئة موروثة، وهو أمر مستحيل.
ودعونا نقول T (الفئة الأساسية) هو من نوع Stream
وU من نوع MemoryStream
(فئة موروثة)، لا يمكنك تعيين Stream
إلى متغير من نوع MemoryStream
.
وأعتقد أن الإجابة المختصرة هي "ليست ممكنة. حاول استخدام أسلوب بدلا من ذلك"
ويبدو أيضا أن يكون مغفل في هذه المسألة عن القيد مشغل طاقتها في الوراثة. NET