在C#中是否有可能以以下方式重载泛型强制转换操作符?
只是想知道在C#3.5中是否存在表示以下代码的方法:在C#中是否有可能以以下方式重载泛型强制转换操作符?,c#,generics,casting,operator-overloading,C#,Generics,Casting,Operator Overloading,只是想知道在C#3.5中是否存在表示以下代码的方法: 公共结构Foo{ 公共食物(T项){ 此项=项; } 公共T项{get;set;} 公共静态显式运算符Foo(fooa) U:T在哪里{ 返回新的Foo((U)a.Item) } } 谢谢您的代码可以归结为一行:返回新的Foo((U)a.Item) 尝试将基类分配给继承的类,这是不可能的 假设T(基类)的类型为Stream,U的类型为MemoryStream(继承类),则不能将流分配给MemoryStream类型的变量 转换运算符不能是泛型
公共结构Foo{
公共食物(T项){
此项=项;
}
公共T项{get;set;}
公共静态显式运算符Foo(fooa)
U:T在哪里{
返回新的Foo((U)a.Item)
}
}
谢谢您的代码可以归结为一行:
返回新的Foo((U)a.Item)
尝试将基类分配给继承的类,这是不可能的
假设T(基类)的类型为
Stream
,U的类型为MemoryStream
(继承类),则不能将流
分配给MemoryStream
类型的变量 转换运算符不能是泛型运算符。根据规范第10.10节,以下是转换运算符声明符的格式:
转换运算符声明符:
隐式运算符类型(类型标识符)
显式运算符类型(类型标识符)
将其与方法头进行比较:
方法标题:
attributesopt方法修饰符选择partialopt返回类型
成员名称类型参数listopt(形式参数listopt)
类型参数约束子句
(很抱歉设置了格式-不确定如何更好地设置格式。)
请注意,运算符格式不包括类型参数列表或类型参数约束。我认为简短的回答是“不可能。请尝试使用方法” 似乎也被这个问题愚弄了
当然可以,如果引用将对象屏蔽为流,但实际上它是一个MemoryStream,那么您当然可以将其强制转换为内存流。这是一个合法的方法,问题是你不能在操作符重载上指定泛型约束……如果你将我的代码表示为一个方法而不是操作符重载,它将被编译,即使我们支持用户定义的泛型转换,这仍然是非法的。定义替换内置转换的转换是非法的。如果T和U是同一类型,则会这样做;您将替换标识转换。因为强制转换由编译器决定,如果T和U是同一类型,那么它将不使用用户定义的强制转换,而是leagal。
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)
}
}
conversion-operator-declarator:
implicit operator type ( type identifier )
explicit operator type ( type identifier )