gpt4 book ai didi

asp.net-mvc-3 - 即使运算符重载也无法转换为字符串

转载 作者:行者123 更新时间:2023-12-02 04:02:51 24 4
gpt4 key购买 nike

在内部值为StringLengthMyType<string>类型的属性上使用MVC3和string验证属性,我得到一个异常:

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

因此,我添加了一个运算符重载,这是我的 class :

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);
}
}

因此,从理论上讲,这应允许将 MyType强制转换为 String。但是,我仍然遇到相同的错误,这是堆栈跟踪:

[InvalidCastException:无法将类型为'MyType'的对象强制转换为类型
'System.String'。]
System.ComponentModel.DataAnnotations.StringLengthAttribute.IsValid(Object
值)+64
System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(Object
值,ValidationContext validateContext)+176
System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(对象
值,ValidationContext validateContext)+41
System.Web.Mvc.d__1.MoveNext()+267
StringLengthAttribute.IsValid方法(来自.NET框架,不是我的代码)正在执行此操作:
public override bool IsValid(object value)
{
this.EnsureLegalLengths();
int num = (value == null) ? 0 : ((string)value).Length;
return value == null || (num >= this.MinimumLength && num <= this.MaximumLength);
}

似乎应该可以,我想念什么?

最佳答案

变量value声明为object类型。由于基础对象不是string,因此必须首先强制转换为实际类型。没有从object转换为其他类型的定义,因此您正在执行的强制转换有效地告诉编译器该对象实际上是string,而实际上不是。这实际上与拆箱值类型时必须遵循的规则相同。

通过首先将其转换为您的类型,然后编译器可以意识到从您的类型到所需的string类型存在(隐式)转换,并可以生成适当的指令。

例如。,

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;

关于asp.net-mvc-3 - 即使运算符重载也无法转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9318430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com