Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Asp.net mvc 3 Can';即使运算符重载,也不能强制转换为字符串_Asp.net Mvc 3_C# 4.0_Casting_Operator Overloading - Fatal编程技术网

Asp.net mvc 3 Can';即使运算符重载,也不能强制转换为字符串

Asp.net mvc 3 Can';即使运算符重载,也不能强制转换为字符串,asp.net-mvc-3,c#-4.0,casting,operator-overloading,Asp.net Mvc 3,C# 4.0,Casting,Operator Overloading,使用MVC3和类型为MyType的属性上的StringLength验证属性,我得到一个异常: 无法将“MyType”类型的对象强制转换为“System.String”类型 所以我添加了一个操作符重载,下面是我的类: public class MyType<T> { public T Value { get; set; } //... public static implicit operator string(MyType<T> instance

使用MVC3和类型为
MyType
的属性上的
StringLength
验证属性,我得到一个异常:

无法将“MyType”类型的对象强制转换为“System.String”类型

所以我添加了一个操作符重载,下面是我的类:

public class MyType<T>
{
    public T Value { get; set; }
    //...

    public static implicit operator string(MyType<T> instance)
    {
        //Return the internal value of the instance.
        return Convert.ToString(instance.Value);
    }
}
看起来应该行得通,我还缺什么

public override bool IsValid(object value)
{
    this.EnsureLegalLengths();
    int num = (value == null) ? 0 : ((MyType<string>)value).Value.Length;
    return value == null || (num >= this.MinimumLength && num <= this.MaximumLength);
}

Edit:不要将
MyType
传递给该方法,将
MyType.Value
传递给该方法,以便强制转换成功。

您使用的是隐式强制转换,您应该执行显式强制转换,因为框架显式强制转换了它。像这样:

(string)value
您应该添加:

public static explicit operator string(MyType<T> instance)
{
    //Return the internal value of the instance.
    return Convert.ToString(instance.Value);
}
公共静态显式运算符字符串(MyType实例)
{
//返回实例的内部值。
返回Convert.ToString(instance.Value);
}

变量
声明为
对象类型
。您必须首先强制转换为实际类型,因为基础对象不是
字符串
。没有定义从
对象
到其他类型的转换,因此您所做的转换实际上是告诉编译器此对象实际上是
字符串
,而不是。这本质上与取消装箱值类型时必须遵循的规则相同

通过首先将其强制转换为您的类型,编译器可以实现从您的类型到所需的
字符串
类型的(隐式)转换,并可以生成适当的指令

e、 g

object obj = new MyObject<string> { Value = "Foobar" };
string x = (string)obj;           // fail: obj is not a string
string y = (MyObject<string>)obj; // obj: obj is cast to MyObject<string> and
                                  //      an implicit cast to string exists
// to be clearer
string z = (string)(MyObject<string>)obj;
objectobj=newmyobject{Value=“Foobar”};
字符串x=(字符串)obj;//失败:obj不是字符串
字符串y=(MyObject)obj;//obj:obj被投射到MyObject并
//存在对字符串的隐式强制转换
//更清楚地说
字符串z=(字符串)(MyObject)obj;

该代码来自使用ILSpy的.NET framework。这在
StringLengthAttribute
类中。@JoshM。那么,您不能将类型
MyType
传递给该方法。只需传递
MyType.Value
。这对你来说很有用,因为那是
字符串
。它在MVC中是自动处理的,我没有手动传递任何东西,它发生在客户端验证期间,然后在回发时再次发生。我认为这是不对的,重载操作符的目的是让你可以将对象强制转换为另一种类型。因此
公共静态隐式运算符字符串(MyType实例)
返回对象的字符串表示形式。即使
是有效的
方法接受
对象
,框架也知道底层类型是什么,您不必首先显式地将其转换为该类型;但我不明白为什么。框架知道它试图将什么类型的对象转换为
字符串
,我告诉了它如何进行转换。它似乎会检查实际类型上的隐式转换,而不是传入的类型。但在这里,编译器只能使用编译时已知的内容。我们所知道的只是我们被赋予了某种目标。对象的实际类型并不是真正已知的,只是它是
对象
或从
对象派生而来。因此,在编译时,唯一已知的从
对象
到实际(或派生程度较低)类型的转换是非转换类型转换。因此,编译器生成了非转换强制转换的指令,但由于我上面解释的原因,它失败了。如果它被声明为
dynamic
,那么运行时本可以发挥它的神奇作用。我确实尝试了
显式
操作符,但它不起作用-我会再试一次。但是,我相信如果您定义一个
隐式运算符
,那么它就可以满足
显式
隐式
强制转换的要求了……否?
public static explicit operator string(MyType<T> instance)
{
    //Return the internal value of the instance.
    return Convert.ToString(instance.Value);
}
object obj = new MyObject<string> { Value = "Foobar" };
string x = (string)obj;           // fail: obj is not a string
string y = (MyObject<string>)obj; // obj: obj is cast to MyObject<string> and
                                  //      an implicit cast to string exists
// to be clearer
string z = (string)(MyObject<string>)obj;