Если я пишу универсальный класс как класс MyGeneric<T>
это возможный записать неявному броску в тип T, таким образом, я могу сделать материал как:
public class MyGeneric<T>
{
...
}
public class GenericProperties
{
public MyGeneric<string> MyGenericString {get;set;}
public void UseMyGeneric()
{
string sTest = MyGenericString;
MyGenericString = "this is a test";
}
}
Действительно ли возможно сделать это путем перегрузки операторов? Я знаю, что это могло быть сделано, если бы мой класс не был дженериком...
Ну, да, но ради любви к зомби Иисуса не делай этого. Это действительно сбивает с толку. Вы слегка неправильно понимаете назначение дженериков, я думаю. Он не привык "превращать" класс в этот тип, он привык, чтобы этот тип (MyGenericString) был "осведомлен" о том, какой тип вам нужен, для различных целей (как правило, это цели, основанные на коллекционировании).
Да, можно использовать неявную Перегрузку оператора преобразования
class Program
{
static void Main(string[] args)
{
myclass<string> a = new myclass<string>();
a.inner = "Hello";
string b = a;
Console.WriteLine(b);
}
}
class myclass<T>
{
public T inner;
public myclass()
{
}
public static implicit operator T(myclass<T> arg1)
{
return arg1.inner;
}
}
Как говорили другие, это юридическое , но опасное . Есть много подводных камней, в которые можно попасть. Например, предположим, что вы определили пользовательский оператор преобразования между C
и T. Тогда вы говорите
C<object> c = new C<object>("hello");
object o = (object) c;
Что происходит? Выполняется ли ваше пользовательское преобразование или нет? Нет, потому что c уже является объектом.
Как я уже говорил, существуют сумасшедшие ситуации, в которые вы можете попасть, когда пытаетесь определить общие операторы преобразования; не делайте этого, если вы не обладаете глубоким и подробным пониманием раздела 10.10.3 спецификации.
да... но не переусердствуйте, это сбивает людей с толку. Я бы использовал его только для оберточных типов.
class Wrapper<T>
{
public T Value {get; private set;}
public Wrapper(T val) {Value = val;}
public static implicit operator T(Wrapper<T> wrapper) {return wrapper.Value;}
public static implicit operator Wrapper<T>(T val) {return new Wrapper<T>(val);}
}
var intWrapper = new Wrapper<int>(7);
var usingIt = 7 * intWrapper; //49
Wrapper<int> someWrapper = 9; //woohoo