Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中是否有可能以以下方式重载泛型强制转换操作符?_C#_Generics_Casting_Operator Overloading - Fatal编程技术网

在C#中是否有可能以以下方式重载泛型强制转换操作符?

在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类型的变量 转换运算符不能是泛型

只是想知道在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
类型的变量

转换运算符不能是泛型运算符。根据规范第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 )