C#3中的自动属性 ​​- 如果我为set声明一个,则必须声明一个get的主体?

Mat*_*att 7 c# .net-3.5

我正在使用VS 2008,在项目的属性页面中,我看到我的目标是.Net 3.5.

这是我在尝试编译时遇到的错误:

AMSDataModels.Vehicle.VIN.get'必须声明一个主体,因为它没有标记为abstract,extern或partial

以下是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AMSDataModels
{
    public class Vehicle
    {
        //NodeID for datastore persistance
        public Guid NodeID { get; set; }

        public string VIN { get; 
            set { 
                if (value.Length != 17) throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
            } }

        public string Make { get; set; }
        public string Model { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我从身体上剥离身体,那么它只是:

public string VIN { get; set; }
Run Code Online (Sandbox Code Playgroud)

一切正常,但我失去了检查VIN的能力.

有没有人建议如何解决这个或更好的方法来解决手头的问题?

我非常喜欢速记符号 - 但验证输入的合法性也很重要!

Bra*_*don 17

如果您要在集合中添加逻辑,则需要将其添加到get中.请注意,在您的设置中,您实际上并未将值设置为任何值?

添加支持字段,

private string _vin;
Run Code Online (Sandbox Code Playgroud)

并在get中返回.

public string VIN
{
    get { return _vin; }
    set
    {
      if (value.Length != 17) 
        throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
      else
        _vin = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • "返回VIN"?这将是一个递归函数,除非我遗漏了一些明显的东西...... (5认同)

Pau*_*der 6

使用自动属性时,编译器会自动生成一个支持字段.当您声明自己的时候,它无法知道要用于get方法的字段.所以你必须声明两者都没有.

顺便提一下,您当前的set方法只检查值 - 它实际上从未将它分配给任何东西.