Is it possible in C# to overload a generic cast operator in the following way?
-
06-07-2019 - |
Question
Just wondering if there is anyway to represent the following code in 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)
}
}
Thanks
Solution
Conversion operators can't be generic. From the spec section 10.10, here's the format of a conversion-operator-declarator:
conversion-operator-declarator: implicit operator type ( type identifier ) explicit operator type ( type identifier )
Compare this with, say, a method-header:
method-header: attributesopt method-modifiersopt partialopt return-type member-name type-parameter-listopt ( formal-parameter-listopt ) type-parameter-constraints-clausesopt
(Sorry about the formatting - not sure how to do it better.)
Note that the operator format doesn't include a type parameter list or type parameter constraints.
OTHER TIPS
Your code boils down to the line: return new Foo<U>((U)a.Item)
Where you try to assign a baseclass to an inherited class, which is impossible.
Let's say T (base-class) is of type Stream
and U is of type MemoryStream
(inherited class), you cannot assign a Stream
to a variable of type MemoryStream
.
I think the short answer is "Not possible. Try using a method instead"
Also seems to be dupe of this question Solution for overloaded operator constraint in .NET generics